ruby-on-rails - Rails/Ruby:将查询结果转换为多级哈希
问题描述
我有一个查询*,结果如下:
#<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
对于查询,我已经使用了两个具有相关 ID 的数组Book
和ListEdition
:
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}}}
这将仅遍历记录一次。
推荐阅读
- php - 循环遍历数组并回显下一个事件
- php - 设置 lighttpd 服务器
- c# - 无法在 VS2017 中使用 Windows 10 进行调试
- python - 在一台主机上管理 docker 容器的构建和运行
- google-app-engine - Google App 引擎为什么 Trace-agent 与 0x 模块不兼容?
- apache-kafka - 什么情况下kafka会溢出?
- json - 类型 _InternalLinkedHashMap
不是 List 类型的子类型 - php - 基于 Woocommerce 中特定产品类别购物车项目数量的购物车费用
- c++ - 使用来自输入文件的重定向命令“<”通过 getline 从标准输入读取的字符串未正确附加
- android - Volley JsonObjectRequest POST 请求