ActiveRecord 按日期(或任何其他列)返回的排序数组

如何通过 created_at日期列对 ActiveRecord 查询返回的数组进行排序?

一旦执行了查询,就会发生这种情况。

请不要告诉我在查询中这样做,因为我需要在视图中发生这种情况。

79460 次浏览

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 数组,在我看来不酷。

order可以使用字符串和符号,它非常有用,并且它接受多个参数

@ users. order (‘ create _ at asc,first _ name desc,last _ name asc’)