【问题标题】:Sort array by object properties but with nil? condition in Ruby按对象属性对数组进行排序但为零? Ruby 中的条件
【发布时间】:2014-06-18 22:03:10
【问题描述】:

我有一组用户,这些用户可能有也可能没有初创公司。启动对象有一个属性名称。

我想按启动名称对用户数组进行排序。但是当用户对象确实有启动时,我显然会得到一个错误。

在查看了 StackOverflow 上的一些解决方案后,我尝试了以下代码。我正在使用 HAML,这就是为什么没有“end”关键字

- @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

编辑:当用户没有启动时,我希望将该用户放在数组的末尾。

【问题讨论】:

  • 如果用户没有创业公司,那你想怎么排序呢?
  • 为了让您走上正确的道路,您可以查看 Ruby 中的评估结果为 nil 的内容。 (或者不那么微妙,当User#startup 返回一个空数组时会发生什么?)
  • @Tacoman667 当用户没有启动时,我希望将该用户放在数组的末尾。

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


【解决方案1】:

首先,您可能希望在控制器甚至模型中进行这种排序。放在你的视野里会有点吵。

其次,此解决方案应该适合您。很短。

@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?。代码假设没有启动的用户可以有一个空数组或空数组。

【讨论】:

  • 太棒了!!!太感谢了。它完美无缺。我还没有投票的特权。一旦我有足够的积分就会投票。
  • 没问题!这让我离无名英雄徽章又近了一步!
【解决方案2】:

为了简化问题,你可以用#sort_by代替sort,它只需要告诉你应该用什么值来比较事物。

@users.sort_by {|u| u.startup.try(:first).try(:name) ? 0 : 1 }

如果方法没有响应我们请求的方法,我们也可以使用#try 返回nil

如果您仍然遇到错误,您应该使用打印启动名称的try 方法

【讨论】:

    猜你喜欢
    • 2010-10-27
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 2020-04-11
    • 2011-09-06
    • 2012-02-20
    • 2010-11-02
    相关资源
    最近更新 更多