2016-05-31 54 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条件。 –