我有很多模特
class User < ActiveRecord::Base
belongs_to :group
end
class Group < ActiveRecord::Base
has_many :users
has_many :posts
end
class Post < ActiveRecord::Base
belongs_to :group
has_many :comments
end
class Comment < ActiveRecord::Base
belongs_to :post
end
要获取用户的帖子,我可以User.find(1).group.posts.all
,但如果我想要用户帖子的所有评论,我就无法User.find(1).group.posts.all.comments.all
。
除了循环播放所有帖子之外,是否有一个简单的解决方案来获取用户帖子的所有评论?
答案 0 :(得分:2)
你想要的是has_many通过关系:http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association
将以下内容添加到您的群组类
has_many :comments, through: :posts
然后你可以通过以下方式获得评论:
User.find(1).group.comments
答案 1 :(得分:1)
单一查询解决方案:
Comment.joins(post: {group: :users}).where(users: {id: 1})
结果查询:
SELECT "comments".* FROM "comments"
INNER JOIN "posts" ON "posts"."id" = "comments"."post_id"
INNER JOIN "groups" ON "groups"."id" = "posts"."group_id"
INNER JOIN "users" ON "users"."group_id" = "groups"."id"
WHERE "users"."id" = 1
答案 2 :(得分:-1)
仅添加has_many :comments, through: :posts
是不够的。
然后,像User.find(1).group.comments
这样的查询会为您提供用户组的所有注释,而不是指定的用户。
另一种方法是查找给定用户的所有帖子ID,并使用它来查找该用户帖子的评论:
post_ids = User.find(1).group.posts.map(&:id).uniq
user_comments = Comment.where(:post => post_ids)