我希望在执行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|
答案 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