それぞれのデータは以下のような配列でしょうか?
ruby
1@thru_1h_start = [["683bc2ab3f8ece9d",1], ["2656bd31891aaf04", 3]]
2@thru_10h_start = [["683bc2ab3f8ece9d", 18], ["2656bd31891aaf04", 10], ["hoge", 11]]
この場合Array#zip
によって合成することはできません。
ruby
1@thru_1h_start.zip(@thru_10h_start)
2#=> [
3# [["683bc2ab3f8ece9d", 1], ["683bc2ab3f8ece9d", 18]],
4# [["2656bd31891aaf04", 3], ["2656bd31891aaf04", 10]]
5# ]
一度Hash
に変換した後にmerge
やvalues_atを用いるのがよいかと思います。
ruby
1ha = Hash[@thru_1h_start]
2hb = Hash[@thru_10h_start]
3keys = ha.keys | hb.keys
4values_a = ha.values_at(*keys)
5values_b = hb.values_at(*keys)
6keys.zip(values_a, values_b) do |key, a, b|
7...
「上から判定する」という事に注意して
if a && a.between?(1,18) && b == 10
などとする必要があります。
が、無駄に長くなるのでsafe navigation operatorを用いて
erb
1<span>
2<% if a.nil? && b.nil? %>Finish
3<% elsif a.nil? && b&.between?(11,18) %>アウトスタートで、インプレイ中 <%= b - 1 %>
4<% elsif a.nil? && b == 10 %>アウトスタートで、アウト終了 <%= a %>
5<% elsif a == 1 && b.nil? %>インスタートで、イン終了 <%= a - 1 %>
6<% elsif a == 1 && b&.between?(11,18) %>インスタートで、インプレイ中 <%= b - 1 %>
7<% elsif a&.between?(2,9) && b == 10 %>アウトスタートで、アウトプレイ中 <%= a - 1 %>
8<% elsif a&.between?(1,9) && b.nil? %>インスタートで、アウトプレイ中 <%= a - 1 %>
9<% else %>なんか変なスコアのいれ方です
10<% end %></span><br>
などとするとよいでしょう。
ただし、これは見やすいのはいいのですが何度か同じ判定をしているのが非効率で気になりますね。
パターンマッチを用いた場合は
erb
1<span>
2<% case [a, b]
3<% in [nil,nil] %>Finish
4<% in [nil, 10] %>アウトスタートで、アウト終了 <%= a %>
5<% in [1, nil] %>インスタートで、イン終了 <%= a - 1 %>
6<% in [nil, 11..18 => hole] %>アウトスタートで、インプレイ中 <%= hole - 1 %>
7<% in [1, 11..18 => hole] %>インスタートで、インプレイ中 <%= hole - 1 %>
8<% in [2..9 => hole, 10] %>アウトスタートで、アウトプレイ中 <%= hole - 1 %>
9<% in [1..9 => hole, nil] %>インスタートで、アウトプレイ中 <%= hole - 1 %>
10<% else %>なんか変なスコアのいれ方です
11<% end %></span><br>
等も可能ですが、2.7時点ですと警告が出るなど常用は難しいです。