所以我有一堆用户,他们都有user.dj_name属性。这是该模型的必要条件,但我仍然在谨慎,因为我遇到了问题。
我想获得一堆用户,然后通过他们的dj_name订购它们。像这样:
@djs = Event.all.map { |e| e.program.user }.sort_by {|x,y| x.dj_name <=> y.dj_name }
它拉动所有有事件的DJ(节目)。它失败了“NoMethodError:未定义的方法`dj_name'代表nil:NilClass”
所以我试过了:
@djs = Event.all.map { |e| e.program.user }
@djs.compact.sort_by! {|x,y| x.dj_name <=> y.dj_name rescue nil}
它没有排序。如果没有“rescue nil”条款,我会得到同样的错误。
如果我做了拒绝!如果对象是零,我什么也得不到。
> @djs.reject! {|d| d.nil? }
=> nil
似乎数组中没有任何对象是nil,排序机制给我带来错误,抢救它只是停止排序过程并返回一个未更改的数组。
HALP?
答案 0 :(得分:2)
对此类任务使用数据库排序。您可以使用以下命令恢复查询:
Event.all(:include => {:program => :user}, :order => 'users.dj_name')
解耦此查询会导致include
方法在模型上创建连接关联,order
在您的查询上创建ORDER BY
。
答案 1 :(得分:2)
使用sort!
,而不是sort_by!
。
sort_by!
将一个参数传递给它的块。因此,当您致电.sort_by! {|x,y| ... }
时,y
始终为nil
。
sort_by!
的目的是按键而不是元素排序。该块获取单个元素,并且必须返回元素的键以用于排序。
在此代码中:
@djs.compact.sort_by! {|x,y| x.dj_name <=> y.dj_name rescue nil}
该块返回nil
作为每个元素的键。结果,没有排序。