[英]Fetch ActiveRecord query result as an array of hashes with chosen attributes
[英]Fetch ActiveRecord model for each key in array of hashes
我有一个带有评论 ID 和他的标题的哈希数组:
arr = [{comment_id: 1, title: 'Title 1'}, {comment_id: 5, title: 'Title 2'}]
对于每个 hash 我必须添加新的:包含活动记录 model 作为值的键:
arr = [{comment_id: 1, user: #<User0x00007fd88dfe1b28>..., title: 'Title 1'},{comment_id: 5, user: #<User0x00005fd58dfe1a31>..., title: 'Title 2'}]
我找到的第一个解决方案是对每个 hash 进行查询:
arr.each do |h|
h[:user] = Comment.find(h[:comment_id]).user
end
但使用单个 sql-query 会更好,例如:
comment_ids = arr.map {|h| h[:comment_id] }
users = User.joins(:comments).order('comments.id').where(comments: {id: comment_ids })
# so here I need to match User with comment_id from comment_ids
如果有人建议解决方案来做到这一点,那就太好了。
首先,我会找到与评论 ID 匹配的评论,但也includes(:user)
(参见Rails 急切加载指南),这样我们就可以在不需要额外查询的情况下获取与评论相关联的用户:
comments = Comment.where(id: comment_ids).includes(:user)
从这一点来说有两种方法可以go 左右事情。 首先Enumerable#find (顺便说一下,与ActiveRecord::Base#find不同)挑选出与特定 id 对应的评论,然后从该评论记录中读取用户
arr.each do |h|
comment = comments.find { |comment| comment.id == h[:comment_id] }
h[:user] = comment.user
end
另一种方法是使用一些可枚举的操作来创建 hash,其中键是评论 ID,值是用户对象。 请参阅index_by和transform_values
users_by_comment_id = comments.index_by(&:id).transform_values(&:user)
arr.each do |h|
h[:user] = users_by_comment_id[h[:comment_id]]
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.