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

mze*_*mel 5 ruby arrays sorting null ruby-on-rails

所以我有一群用户,他们都有 user.dj_name 属性。这是模型上经过验证的必要性,但我仍然保持谨慎,因为我遇到了问题。

我想要获得一群用户,然后按他们的 dj_name 对他们进行排序。像这样的东西:

@djs = Event.all.map { |e| e.program.user }.sort_by {|x,y| x.dj_name <=> y.dj_name }
Run Code Online (Sandbox Code Playgroud)

它吸引了所有举办活动(表演)的 DJ。它失败并显示“NoMethodError:nil:NilClass 的未定义方法‘dj_name’”

所以我尝试:

@djs = Event.all.map { |e| e.program.user }
@djs.compact.sort_by! {|x,y| x.dj_name <=> y.dj_name rescue nil}
Run Code Online (Sandbox Code Playgroud)

它不排序。如果没有“rescue nil”子句,我会得到同样的错误。

如果我拒绝了!如果对象为零,我什么也得不到。

> @djs.reject! {|d| d.nil? }
=> nil 
Run Code Online (Sandbox Code Playgroud)

看起来数组中没有一个对象是 nil,排序机制给了我错误,拯救它只是停止排序过程并返回一个未更改的数组。

半停?

Mur*_*foX 2

使用数据库排序来完成此类任务。您可以使用以下方式恢复查询:

Event.all(:include => {:program => :user}, :order => 'users.dj_name')
Run Code Online (Sandbox Code Playgroud)

解耦此查询将导致该include方法在模型上建立连接关联并在查询上order创建连接。ORDER BY