sort_by上的nil对象的NoMethodError,并且存在所有对象

时间:2013-06-06 22:46:51

标签: ruby-on-rails ruby arrays sorting null

所以我有一堆用户,他们都有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?

2 个答案:

答案 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作为每个元素的键。结果,没有排序。

顺便说一句,我同意@MurifoX,在这种特殊情况下你应该为数据库提供排序。