我尝试按两列排序,一个是被忽略的关联列,未实现。是否可以通过循环中的关联进行排序?
循环
<% @info.each do |data| %>
<% data.selections.size.times do |i| %>
<% unless data.progressions.blank? %>
<% data.progressions.order_scope.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 %>
<% end %>
<% end %>
模型
belongs_to :selection, primary_key: 'selection_id', foreign_key: 'selection_id', optional: true
belongs_to :assessment, primary_key: 'assessment_id', optional: true
scope :order_scope, -> { order('selection_id').joins(:assessment).order('assessments.date') }
这是前一代码输出的输出,它似乎是随机放置日期而不是按顺序排列。
|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|
答案 0 :(得分:0)
我认为这是因为进度可能具有相同的selection_id
,当您订购它们时,结果可能会有所不同。尝试在order
中添加其他唯一属性/列,例如created_at
或id
,以便订单始终是唯一的。
scope :order_scope, -> { order('selection_id, created_at').joins(:assessment).order('assessments.date') }
答案 1 :(得分:-1)
那么,您尝试做的基本上是按2列排序并使用结果输出一些内容? 是的,可以做到。 事实是,我建议使用SQL代替,因为在Ruby方法中,它的可读性要低得多。
在ruby中执行此查询:
SELECT * FROM selections s JOIN assessments a ON s.selection_id = a.selection_id ORDER BY a.date [DESC], s.selection_id [DESC]
[DESC]
是可选的关键字设置顺序,以降序方式(默认为升序)。
结果应该是您正在寻找的。 p>