【发布时间】:2018-12-12 18:30:05
【问题描述】:
我有一个查询*,结果如下:
#<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>
]
}
我应该如何进行?
*EDIT: 这是模型结构和查询。另一位用户要求:
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
对于查询,我已经使用了两个具有相关 ID 的数组,分别是 Book 和 ListEdition:
BookRank.where(:book_id => book_ids, :list_edition_id => list_edition_ids)
【问题讨论】:
-
“那么排名数据仍然在数组中” - 如果你也对这些数组进行分组呢?
-
我通过将多个
group_bys 与map(以像另一个哈希一样将值转换为合适的格式)、to_h和sort/sort_by来解决类似的问题。我不知道有更优雅的解决方案,但也很想看到一个。但只要它有效(并且您的查询不会产生太大而无法由 ruby 就地处理的数据),这可能是一种方法。 -
我想理论上我可以在第二步中按 list_edition_id 分组,但我不知道如何正确嵌套语句。 @JaySchneider:通常每个请求最多可以处理 300 个 BookRank。不理想,宁愿在数据库中完成这项工作,但它可以工作。
-
能否在您的问题中添加您的查询?
标签: ruby-on-rails ruby activerecord ruby-hash