ruby-on-rails - rails/ ruby : turning query result into multi-level hash

标签 ruby-on-rails ruby activerecord ruby-hash

我有一个查询*,结果如下:

#<ActiveRecord::Relation [
    #<BookRank id: 2, book_id: 2, list_edition_id: 1, rank_world: 5, rank_europe: 1>,
    #<BookRank id: 3, book_id: 1, list_edition_id: 1, rank_world: 6, rank_europe: 2>,
    #<BookRank id: 8, book_id: 2, list_edition_id: 3, rank_world: 1, rank_europe: 1>,
    #<BookRank id: 9, book_id: 1, list_edition_id: 3, rank_world: 2, rank_europe: 2
]>

我想要得到的是这样的哈希:

{
    book_id => {
        list_edition_id => {
            "rank_world" => value,
            "rank_europe" => value
        }
    }
}

(最重要的是按照最低 list_edition_id 的rank_world 值对哈希进行排序,但这可能太复杂了。)

ranks_relation.group_by(&:book_id) 给我一个哈希,其中 book_ids 是键,但排名数据仍然在数组中:

{
    2 => [
            #<BookRank id: 2, book_id: 2, list_edition_id: 1, rank_world: 5, rank_europe: 1>,
            #<BookRank id: 8, book_id: 2, list_edition_id: 3, rank_world: 1, rank_europe: 1>
    ],
    1 => [
            #<BookRank id: 3, book_id: 1, list_edition_id: 1, rank_world: 6, rank_europe: 2>
            #<BookRank id: 9, book_id: 1, list_edition_id: 3, rank_world: 2, rank_europe: 2>
    ]
}

我应该如何进行?

*编辑:这是模型结构和查询。另一位用户提出要求:

class Book < ActiveRecord::Base
  has_many :book_ranks, dependent: :destroy
end

class List < ActiveRecord::Base
  has_many :list_editions, dependent: :destroy
end

class ListEdition < ActiveRecord::Base
  belongs_to :list
  has_many :book_ranks, dependent: :destroy
end

class BookRank < ActiveRecord::Base
  belongs_to :book
  belongs_to :list_edition

  has_one :list, through: :list_edition
end

对于查询,我已经使用了两个具有 BookListEdition 相关 ID 的数组:

BookRank.where(:book_id => book_ids, :list_edition_id => list_edition_ids)

最佳答案

试试这个

record = your_record

hash = {}

record.each do |record|
  hash[record.book_id] ||= {}
  hash[record.book_id][record.list_edition_id] = {
    'rank_world' => record.rank_world,
    'rank_europe' => record.rank_europe
  }
end
# hash will then be {2=>{1=>{"rank_world"=>5, "rank_europe"=>1}, 3=>{"rank_world"=>1, "rank_europe"=>1}}, 1=>{1=>{"rank_world"=>6, "rank_europe"=>2}, 3=>{"rank_world"=>2, "rank_europe"=>2}}}

这只会迭代记录一次。

关于ruby-on-rails - rails/ ruby : turning query result into multi-level hash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51171568/

相关文章:

mysql - 在 Rails 上的架构中设置全局变量

ruby - GIt 部署 + 配置文件 + Heroku

ruby-on-rails - Rails 中未定义的局部变量或方法 to_a?

ruby - 如何检查 RSpec 中 Nil 的变化

ruby - 卡住对象中的内存方法

ruby - 事件记录 3 选择嵌套表

ruby-on-rails - 在 Ruby on Rails 中使用无限 float

mysql - Rails 3.1.2 运行非常非常慢。貌似是mysql2 ActiveRecord开发模式的问题

javascript - 如何从 Rails 向 Fuel UX 数据网格提供数据?

ruby-on-rails - 通过用户名查找用户或使用一个字段的电子邮件