在执行查找后,ruby / rails是否可以对结果集进行排序?例如,是否可以做这样的事情
警告:不起作用
if type == 1
@items = mycompany.items
else
@items = myhome.items
end
@items = @items :order => "created_at"
我会假设这样的事情应该是可能的,但我仍然是RoR的新手,似乎无法在谷歌上找到任何东西。
答案 0 :(得分:6)
您应该可以执行以下任一操作:
访问时排序:
if type == 1
@items = mycompany.items(:order => 'created_at')
else
@items = myhome.items(:order => 'created_at')
end
访问后排序:
@items.sort{|a,b| a.created_at <=> b.created_at}
答案 1 :(得分:5)
如果要在收集ActiveRecord对象后进行排序,还可以使用rails中可用的Symbol
to Proc
shorthand和Enumerable#sort_by
来简化排序语句:
@items.sort_by(&:created_at)
# is the same as @items.sort{ |a, b| a.created_at <=> b.created_at }
答案 2 :(得分:4)
我不知道为什么每个人都在“不可以”的时候在命名的范围内。
例如,定义为ActiveRecord :: Base的一部分:
named_scope :by_created_at, :order_by => 'created_at'
这允许您在实际检索之前将简单关系转换为有序关系:
@items = @items.by_created_at
作为一个说明,包含具有重叠的范围不是一个好主意:订单定义因为这会导致它们被附加而不是依次覆盖它们。
然而,在你的例子中,想象重构如下所示并不是太过分了:
reference =
case (type)
when 1
mycompany
else
myhome
end
@items = reference.items.all(:order_by => 'created_at')