ruby - 按多列对事件记录数组进行排序

标签 ruby ruby-on-rails-3

给定一个事件记录数组

jobs = [#<Job _id: 1, created_at: 2014-07-15 19:18:40 UTC, organization: "Acme In.c">,
        #<Job _id: 3, created_at: 2014-05-20 09:27:38 UTC, organization: "Baxter">, 
        #<Job _id: 2, created_at: 2014-11-25 12:21:00 UTC, organization: "Wizard">, 
        #<Job _id: 3, created_at: 2015-01-15 07:20:10 UTC, organization: "Baxter">]

我怎样才能首先按 organization 以 A->Z 升序对数组进行排序,然后按 created_at 降序排序以结束此 ...

jobs = [#<Job _id: 1, created_at: 2014-07-15 19:18:40 UTC, organization: "Acme In.c">,
        #<Job _id: 3, created_at: 2015-01-15 07:20:10 UTC, organization: "Baxter">,
        #<Job _id: 3, created_at: 2014-05-20 09:27:38 UTC, organization: "Baxter">,
        #<Job _id: 2, created_at: 2014-11-25 12:21:00 UTC, organization: "Wizard">]

我试着做 jobs.sort_by{|j| [j.organization, j.created_at]} 但我不太确定如何指定多个 asc/desc 规则,我得到的最接近的规则是按组织排序的,但是按创建的排序让我从最旧到最新而不是最新到最旧。我也试过先分组然后排序,但我也无法让它工作。任何帮助,如果赞赏。

最佳答案

一个好方法是使用 sort <=> nonzero? 像这样:

jobs.sort{|a,b| 
  (a.organization <=> b.organization).nonzero? ||
  (b.created_at <=> a.created_at)
}

这段代码说:

  1. 按组织比较 A 和 B。
  2. 如果他们不同,那么我们就有了答案。
  3. 如果它们相同,那么我们需要做更多。
  4. 按时间比较 B 和 A。 (注B&A顺序相反)
  5. 如果他们不同,那么我们就有了答案。
  6. 如果它们相同,则排序顺序无关紧要。 (Ruby 排序“不稳定”)

独立于 ActiveRecord 的示例代码:

require 'time'
require 'ostruct'

jobs = [
  OpenStruct.new(_id: 1, created_at: Time.parse("2014-07-15 19:18:40 UTC"), organization: "Acme Inc"),
  OpenStruct.new(_id: 3, created_at: Time.parse("2014-05-20 09:27:38 UTC"), organization: "Baxter"), 
  OpenStruct.new(_id: 2, created_at: Time.parse("2014-11-25 12:21:00 UTC"), organization: "Wizard"), 
  OpenStruct.new(_id: 3, created_at: Time.parse("2015-01-15 07:20:10 UTC"), organization: "Baxter")
]

关于ruby - 按多列对事件记录数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27974962/

相关文章:

ruby-on-rails-3 - rails i18n accepts_nested_attributes_for how-to translate?

ruby-on-rails - 我应该在哪里放置 Rails 中多个 Controller 使用的方法?

ruby-on-rails-3 - 正确的 Github 应用程序 URL

Ruby 基本对象方法

ruby-on-rails - Rails - 使用 [ 和 ] 从字符串中提取子字符串

ruby-on-rails - 无法安装 gem 'pg' 将rails应用程序部署到heroku

ruby-on-rails - rails 康康角色?

regex - 用于测试合规 FATCA 全局中介识别码 (GIIN) 的正则表达式是什么?

ruby-on-rails - Rails Thread.current[] 和线程安全

ruby-on-rails - 在模型中访问Devise的current_user