2009-08-14 64 views

回答

105

Ruby包含对开箱即用的支持。

sorted = @records.sort_by &:created_at 

但是,这似乎与显示没有太大关系,可能属于控制器。

+2

可枚举#sort_by对于这类事情来说非常棒,比使用Enumerable#sort的其他例子要好得多。 – tadman 2009-08-14 16:21:28

+1

感谢您的澄清。我对同一个视图有多个“入口点”,查询可能有也可能没有相同的排序模式(我知道,并不理想)。但是,不是显示东西列表的顺序不一定是“仅限控制器”功能? – user94154 2009-08-14 16:34:46

+1

tadman - 照顾详细?这是我从api文档中了解到,sort_by是一种更慢,更灵活的做法。非常适合更复杂的分类,但对于简单的事情来说太多了。 – 2009-08-14 16:47:43

24

就叫排序的收集,传递的代码,它告诉红宝石块你想要的排序:

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

非常感谢您的快速响应 – user94154 2009-08-14 15:33:29

+2

与这种情况下的'.sort_by'相比,这样做效率太低。请查看Chuck的其他答案。 – Dogbert 2011-02-20 10:31:16

+6

为了记录,这将比我给出的版本低效。 – Chuck 2013-03-10 21:35:24

25

虽然红宝石Enumerable是真棒,ActiveRecord的查询实际上将返回一个ActiveRecord ::关系其查询尚未被评估(延迟加载),并且可以通过调用该命令的方法将该处理卸载到数据库,在该数据库中,该数据库的扩展比基于Enumerable的策略要好得多。

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

sorted = @records.order(:created_at) 
1

请抢在这一个,并检查复杂性。

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

#versus 

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

排序ActiveRecord的阵列,最好的办法是使用默认的方法为了

@ users.order(:created_at)

这是最快捷,最合适的解决方案,因为在那大小写从数据库返回排序后的数组,并且您不需要在类中使用任何其他操作,例如,如果您将使用建议的sort_by它将循环抛出数组中的每个元素,之后它将不会是ActiveRecord数组,不在我看来很酷。

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

@ users.order( 'created_at ASC,FIRST_NAME递减,姓氏ASC')

相关问题