2016-05-31 44 views
0

給定一個ActiveRecord::Relation馬拉松參與者的實例及其各自的完成時間。我如何確定在同一時間完成的任何兩個或更多參與者的職位(即第一,第二,第三)?例如:如何操作數組索引

@runners = Runners.where(maranthon_year_id:2016,位置: '問')的順序。(完成時間::升序)

通常,我通過有鑑於此迭代像這樣:

<% count = 0 %> 
    <% if @runners.each do |runner| %> 
    <tr> 
    <td><%= runner.id %></td> 
    <td><%= runner.name %></td> 
    <td><%= runner.finish_time %></td> 
    <td><%= (count += 1).ordinalize %></td> 
    </tr> 
    <% end.empty? %> 
    <tr> 
    <td colspan="4"> No Record Found</td> 
    </tr> 
    <% end %> 

但是,如果兩個或更多的用戶在準確的時間完成上述不起作用。

這是所需的輸出:

enter image description here

注意的Eyal的立場是4th(不3rd),因爲兩個參與者名列第二。

回答

0

@Ilya與分組結果是一個好主意,但是解決方案將無法跳過的例子第三名。我們需要另一個變量來跟蹤地點。

<% count = 1 %> 
<% @runners.group_by(&:finish_time).each do |(time, runners)| %> 
    <% place = count %> 
    <% runners.each do |r| %> 
    <tr> 
     <td><%= r.id %></td> 
     <td><%= r.name %></td> 
     <td><%= time %></td> 
     <td><%= place.ordinalize %></td> 
    </tr> 
    <% count += 1 %> 
    <% end %> 
<% end %> 
+0

您的意思是'@ runners.each'而不是runners.each在第4行嗎?我嘗試了'@ runners.each',它很好地跳過了位置(謝謝!),但它執行了一個雙循環,所以我重複了8行而不是4行。我編輯了我的問題來添加表格行,因爲這可能會影響您的答案?再次感謝。 –

+0

我想我沒有正確使用activerecord'group'方法。我已經將結果與group_by分組 - 取而代之的是 - 現在可以使用'runners'(而不是'@ runners') –

+0

不錯。這工作,woulda花了一段時間自己解決這個問題。非常感謝。 –

0

這應該做的伎倆:

<% count = 0 %> 
<% @runners.each do |runner| %> 
    <td>runner.id</td> 
    <td>runner.name</td> 
    <td>runner.finish_time</td> 
    <% if runner.finish_time == @runners[count].finish_time %> 
    <td><%= count.ordinalize %></td> 
    <% count += 1 %> 
    <% else %> 
    <td><%= (count += 1).ordinalize %></td> 
    <% end %> 
<% end %> 
+0

由於count初始化爲0,所以<%= count.ordinalize%>在第一次運行時打印0,嘗試將初始化更改爲1會更改if條件。 –