【问题标题】:NoMethodError for nil object on sort_by, and all objects existsort_by 上 nil 对象的 NoMethodError,并且所有对象都存在
【发布时间】:2013-06-06 22:46:50
【问题描述】:

所以我有一堆用户,他们都有 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: undefined method `dj_name' for 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,排序机制给了我错误,拯救它只是停止排序过程并返回一个未更改的数组。

暂停?

【问题讨论】:

  • 你不应该使用内联 rescuecompact 无论如何都会删除 nil 元素。
  • 您的错误 NoMethodError for nil object 告诉您您尝试排序的对象是空的,因此在执行此错误时会抛出此错误。
  • 这让我发疯了。我没有向下滚动查看最后一个答案,这是正确的,也是我正在做的。我认为您应该接受这一点,因为它实际上解决了问题。

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


【解决方案1】:

对此类任务使用数据库排序。您可以使用以下命令恢复查询:

Event.all(:include => {:program => :user}, :order => 'users.dj_name')

解耦此查询将导致include 方法在您的模型上建立连接关联,而order 在您的查询上创建ORDER BY

【讨论】:

    【解决方案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 的观点,在这种特殊情况下,您应该使用数据库提供的排序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-05
      • 2014-07-08
      相关资源
      最近更新 更多