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

时间:2009-08-14 15:24:34

标签: ruby-on-rails ruby arrays activerecord

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

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

请不要告诉我在查询中执行此操作,因为我需要在视图中执行此操作。

5 个答案:

答案 0 :(得分:120)

Ruby支持开箱即用的排序。

sorted = @records.sort_by &:created_at

但是,这似乎与显示无关,可能属于控制器。

答案 1 :(得分:30)

虽然Ruby Enumerable非常棒,但ActiveRecord查询实际上会返回一个ActiveRecord :: Relation,其查询尚未被评估(延迟加载),并且可以在其上调用order方法来卸载此处理到数据库,它比基于Enumerable的策略更好地扩展。

使用Enumerable进行排序还会混淆在数据库中进行分页。没有什么可以阻止在视图中应用订单策略。但是,我倾向于将其放在模型的范围内。

sorted = @records.order(:created_at)

答案 2 :(得分:26)

只需在集合上调用sort,传入代码块,告诉Ruby你想要它如何排序:

collection.sort { |a,b| a.created_at <=> b.created_at }

答案 3 :(得分:4)

请看这个并检查复杂性。

Model.all.sort_by{|m| m.created_at} #=> O(log n)

#versus

Model.order(“created_at DESC”) #=> O(1)

答案 4 :(得分:1)

排序ActiveRecord数组的最佳方法是使用默认方法顺序

  

@ users.order(:created_at)

这是最快和最正确的解决方案,因为在这种情况下它会从db返回已排序的数组,您无需在类中使用任何其他操作,例如,如果您将使用建议的sort_by它将循环抛出数组的每个元素,之后它将不是ActiveRecord数组,在我看来并不酷。

order可以使用字符串和sumbols,它非常有用,并且需要多个参数

  

@ users.order('created_at asc,first_name desc,last_name asc')