如何通过 created_at日期列对 ActiveRecord 查询返回的数组进行排序?
created_at
一旦执行了查询,就会发生这种情况。
请不要告诉我在查询中这样做,因为我需要在视图中发生这种情况。
Ruby 包括对排序的支持。
sorted = @records.sort_by &:created_at
但是,这似乎与显示没有太大关系,可能属于控制器。
只需要对集合调用 sort,传递一段代码告诉 Ruby 你希望它如何排序:
collection.sort { |a,b| a.created_at <=> b.created_at }
虽然 Ruby 数不胜数非常棒,但 ActiveRecord 查询实际上会返回一个 ActiveRecord: : 关系,它的查询还没有被评估(Lazy Loading) ,并且可以调用订单方法将这个处理过程卸载到数据库中,在那里它的伸缩性比基于 数不胜数的策略要好得多。
使用枚举进行排序也会妨碍在数据库中进行分页。没有什么可以阻止在视图中应用订单策略。然而,我倾向于把它放在模型的作用域中。
sorted = @records.order(:created_at)
请看这一个,并检查复杂性。
Model.all.sort_by{|m| m.created_at} #=> O(log n) #versus Model.order(“created_at DESC”) #=> O(1)
对 ActiveRecord 数组进行排序的最佳方式是使用默认的方法顺序
@ users. order (: create _ at)
这是最快也是最正确的解决方案,因为在这种情况下,它从 db 返回排序的数组,你不需要在 Class 中使用任何其他操作,例如,如果你将使用建议的 sort_by,它将循环抛出数组的每个元素,之后它将不是 ActiveRecord 数组,在我看来不酷。
sort_by
order可以使用字符串和符号,它非常有用,并且它接受多个参数
order
@ users. order (‘ create _ at asc,first _ name desc,last _ name asc’)