在each_with_index中按日期而不是索引循环

时间:2018-03-12 23:46:26

标签: ruby-on-rails ruby-on-rails-5

我希望在执行each_with_index循环时按两个键列进行排序。第一个排序选项:selection_id工作正常,但集合循环的顺序似乎忽略了assessments.date顺序。

我的约会时间以毫秒为单位。这可能是问题吗?

循环

<% unless data.progressions.blank? %>
    <% data.progressions.order('selection_id, assessments.date ASC').in_groups_of(7)[i].each_with_index do |e, index| %>
    <% if index == 0 %>
      <%= e.selection.name rescue 0 %>
    <% end %>
    <%= Time.at(e.assessment.date/1000).strftime("%d/%m/%Y") rescue 0 %>
  <% end %>
<% end %>

所以最新发生的是它会显示这样的东西。

|name 1|     0    |0|0|0|02/01/2018|15/01/2018|23/01/2018|

|name 2|28/02/2018|0|0|0|02/01/2018|15/01/2018|21/01/2018|

不按顺序显示日期,在某些情况下,它会在中间添加空记录。

我期待得到:

|name 1|02/01/2018|15/01/2018|23/01/2018|     0    |0|0|0|

|name 2|02/01/2018|15/01/2018|21/01/2018|28/02/2018|0|0|0|

2 个答案:

答案 0 :(得分:1)

我猜你真正想要的是将记录分组为:selection_id,然后按每个组中的assessments.date排序。我认为问题在于,通过对这两个属性使用order,您可能在每个组中混合了不同的选择,但是您没有注意到它,因为您只显示第一个索引的选择名称

我建议你通过做这样的事来解决它。

<% if (selections = data.progressions.order("assessments.date  ASC").group_by(&:selection)).any? %>
  <% selections.each_pair do |selection, collections| %>
    <%= selection.name %>
    <% collections.each do |e| %>
      <%= Time.at(e.assessment.date/1000).strftime("%d/%m/%Y") rescue 0 %>
    <% end %>
  <% end %>
<% end %>

这里发生的是所有记录首先由assessments.date排序,但后来调用group_by(&:selection)将创建一个Hash对象,其中每个键都是唯一的:selection,值将由属于选择的所有progressions。例如:

{ #<Selection id=1 ...> => [ #<Progression id=2 ...>, #<Progression id=3 ...> ],
  #<Selection id=4 ...> => [ #<Progression id=5 ...> ]
}

因此,通过使用方法each_pair,我们可以先遍历选择,然后在子循环中进行集合。

最后一点,使用data.progressions.includes(:selection, :assessment)可以提高性能,但在基本功能正常工作之前,我不会担心这一点。

我希望我没有把事情弄得太复杂。

答案 1 :(得分:0)

你通常不会使用这样的两个订单,所以我不确定你在这里尝试做什么。您的第二个订单确实会覆盖第一个订单,因为它的工作原理(因此您可以重新调整默认排序顺序)。

通常,您使用两个字段{/ 1}},例如

order

或类似......那是你想要做的吗?

以下是使用订单的更多示例:https://apidock.com/rails/ActiveRecord/QueryMethods/order