ruby-on-rails - 按对象属性对数组进行排序但使用 nil? Ruby 中的条件

标签 ruby-on-rails ruby arrays sorting haml

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

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

在浏览了 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/

相关文章:

ruby-on-rails - Ruby 找不到 psych.so 尽管它存在

javascript - 覆盖 Rails 远程表单提交中使用的 JavaScript 模板

ruby strftime 给出错误的时间

python - 如何仅将值添加到 Numpy 2D 矩阵中的某些索引

c - 将数组传递给 void 函数

ruby-on-rails - 使用 Jruby/Rails 实现 Google 的 hashbang/Ajax 爬网?

ruby-on-rails - rails mysql2 : how to verify mysql server's SSL certificate?

ruby - 如何使用 Sequel 运行 Postgres psql "slash"命令

ruby-on-rails - Rails 4,如何使用行号记录文件

arrays - 变量中带有逗号的 ColdFusion 表单数组