【问题标题】:How to manipulate Array's Index如何操作数组的索引
【发布时间】:2016-05-31 19:53:37
【问题描述】:

给定一个ActiveRecord::Relation 马拉松参与者的实例及其各自的完成时间。我如何确定任何两个或多个同时完成的参与者的位置(即第一、第二、第三)?例如:

@runners = Runners.where(maranthon_year_id: 2016, location: 'ask').order(finish_time: :asc)

通常,我会像这样遍历这个视图:

  <% 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 %>

但如果两个或更多用户在准确的时间完成,则上述方法不起作用。

这是所需的输出:

请注意,Eyal 的位置是 4th(不是 3rd),因为有两个参与者排在第二位。

【问题讨论】:

    标签: ruby-on-rails arrays activerecord


    【解决方案1】:

    @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 %>
    

    【讨论】:

    • 第 4 行的意思是“@runners.each”而不是 runners.each?我试过'@runners.each',它很好地跳过了位置(谢谢!),但它执行了一个双循环,所以我有重复——8行而不是4行。我编辑了我的问题以添加表格行,因为这可能会影响您的答案?再次感谢。
    • 我认为我没有正确使用 activerecord group 方法。我已经获取了结果并将它们与 group_by 分组 - 现在应该可以使用 runners(而不是 @runners
    • 不错。那行得通,我自己会花一些时间来解决这个问题。非常感谢。
    【解决方案2】:

    这应该可以解决问题:

    <% 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 %>
    

    【讨论】:

    • 由于 count 被初始化为 0, 在第一次运行时打印第 0 个,尝试将初始化更改为 1 更改 if 条件。
    猜你喜欢
    • 2021-11-02
    • 2021-09-19
    • 1970-01-01
    • 2021-10-12
    • 2012-04-01
    • 1970-01-01
    • 2014-01-15
    • 2013-11-04
    • 1970-01-01
    相关资源
    最近更新 更多