如何对由created_at
日期列的ActiveRecord查询返回的数组进行排序?按日期(或任何其他列)对ActiveRecord返回的数组进行排序
查询执行后会发生这种情况。
请不要告诉我在查询中这样做,因为我需要在视图中发生这种情况。
如何对由created_at
日期列的ActiveRecord查询返回的数组进行排序?按日期(或任何其他列)对ActiveRecord返回的数组进行排序
查询执行后会发生这种情况。
请不要告诉我在查询中这样做,因为我需要在视图中发生这种情况。
Ruby包含对开箱即用的支持。
sorted = @records.sort_by &:created_at
但是,这似乎与显示没有太大关系,可能属于控制器。
虽然红宝石Enumerable是真棒,ActiveRecord的查询实际上将返回一个ActiveRecord ::关系其查询尚未被评估(延迟加载),并且可以通过调用该命令的方法将该处理卸载到数据库,在该数据库中,该数据库的扩展比基于Enumerable的策略要好得多。
使用Enumerable进行排序也会混淆在数据库中执行分页。没有什么可以阻止在视图中应用订单策略。不过,我倾向于将这一点放在模型的范围内。
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(:created_at)
这是最快捷,最合适的解决方案,因为在那大小写从数据库返回排序后的数组,并且您不需要在类中使用任何其他操作,例如,如果您将使用建议的sort_by
它将循环抛出数组中的每个元素,之后它将不会是ActiveRecord数组,不在我看来很酷。
order
可以使用字符串和sumbols,这是非常有用的,它需要多个参数
@ users.order( 'created_at ASC,FIRST_NAME递减,姓氏ASC')
可枚举#sort_by对于这类事情来说非常棒,比使用Enumerable#sort的其他例子要好得多。 – tadman 2009-08-14 16:21:28
感谢您的澄清。我对同一个视图有多个“入口点”,查询可能有也可能没有相同的排序模式(我知道,并不理想)。但是,不是显示东西列表的顺序不一定是“仅限控制器”功能? – user94154 2009-08-14 16:34:46
tadman - 照顾详细?这是我从api文档中了解到,sort_by是一种更慢,更灵活的做法。非常适合更复杂的分类,但对于简单的事情来说太多了。 – 2009-08-14 16:47:43