我有一组用户,他们可能有也可能没有一组初创公司。启动对象有一个属性名称。
我想按启动名称对用户数组进行排序。但是当用户对象确实有启动时,我显然会出错。
在浏览了 StackOverflow 上的一些解决方案后,我尝试了以下代码。我正在使用 HAML,这就是为什么没有“结束”关键字
- @users.sort do |a, b|
- a.startup.nil? ? -1 : b.startup.nil? ? 1 : a.startup[0].name <=> b. startup[0].name
但是我得到了以下错误。
undefined method `name' for nil:NilClass
在尝试
- @users.sort do |a, b|
- a.startup[0].nil? ? -1 : b.startup[0].nil? ? 1 : a.startup[0].name <=> b. startup[0].name
用户数组根本没有排序。
注意:我引用了这篇 SO 帖子 Sorting an array of arrays in Ruby
我也试过
-@users.sort{|a,b| a.startup[0].name && b.startup[0].name ? a.startup[0].name <=> b.startup[0].name : a.startup[0].name ? -1 : 1 }
本质上是
foo.sort{|a,b| a && b ? a <=> b : a ? -1 : 1 }
来自 SO 条目:sorting a ruby array of objects by an attribute that could be nil
即使这样也有错误
undefined method `name' for nil:NilClass
编辑:当用户没有启动时,我希望将该用户放在数组的末尾。
最佳答案
首先,您可能想在 Controller 甚至模型中进行排序。将它放在您的 View 中会使它有点嘈杂。
其次,此解决方案应该适合您。它相当短。
@users.sort_by { |u| u.startup.nil? || u.startup.blank? ? 255.chr : u.startup[0].name }
使用255.chr
会将所有空([]
)和空(nil
)数组推到数组的后面,如您在评论中指定要这样做。我假设有一种更简洁的方式来表示 255.chr
,但我一直找不到。
如果没有启动的用户表示为空数组 ([]
),那么您可以删除 u.startup.nil? ||
来自那行代码。同样,如果没有启动的用户表示为 nil
,那么您可以删除 || u.startup.blank?
从它。代码假定没有初创公司的用户可以有一个空数组或空数组。
关于ruby-on-rails - 按对象属性对数组进行排序但使用 nil? Ruby 中的条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24295737/