Ara*_*ack 1 ruby arrays sorting haml ruby-on-rails
我有一组用户,可能有也可能没有一系列初创公司.启动对象具有属性名称.
我想按启动名称对用户数组进行排序.但是当用户对象确实有启动时,我显然会收到错误.
在完成StackOverflow上的一些解决方案后,我尝试了以下代码.我正在使用HAML,这就是为什么没有"结束"关键字
- @users.sort do |a, b|
- a.startup.nil? ? -1 : b.startup.nil? ? 1 : a.startup[0].name <=> b. startup[0].name
Run Code Online (Sandbox Code Playgroud)
但我得到以下错误.
undefined method `name' for nil:NilClass
Run Code Online (Sandbox Code Playgroud)
在尝试
- @users.sort do |a, b|
- a.startup[0].nil? ? -1 : b.startup[0].nil? ? 1 : a.startup[0].name <=> b. startup[0].name
Run Code Online (Sandbox Code Playgroud)
用户数组根本没有排序.
注意:我提到了这个SO post 在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 }
Run Code Online (Sandbox Code Playgroud)
这本质上是
foo.sort{|a,b| a && b ? a <=> b : a ? -1 : 1 }
Run Code Online (Sandbox Code Playgroud)
来自SO条目:通过可能为零的属性对ruby数组对象进行排序
即使这样也给出了错误
undefined method `name' for nil:NilClass
Run Code Online (Sandbox Code Playgroud)
编辑:当用户没有启动时,我希望将该用户放在数组的末尾.
首先,您可能希望在控制器中甚至在模型中进行此排序.把它放在你的视野中会让它有点吵.
其次,这个解决方案应该适合你.它很短.
@users.sort_by { |u| u.startup.nil? || u.startup.blank? ? 255.chr : u.startup[0].name }
Run Code Online (Sandbox Code Playgroud)
使用255.chr将把所有empty([])和null(nil)数组推送到数组的后面,正如您在评论中指定的那样,您希望这样做.我认为有一种更清晰的表达方式255.chr,但我找不到.
如果没有启动的用户表示为空数组([]),则可以u.startup.nil? ||从该行代码中删除.同样,如果没有启动的用户表示为nil,则可以从中删除|| u.startup.blank?.代码假设没有启动的用户可以具有空数组或空数组.