Rails中嵌套的ActiveRecord关系

时间:2014-02-26 22:15:52

标签: ruby-on-rails ruby activerecord relationship

我有很多模特

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

除了循环播放所有帖子之外,是否有一个简单的解决方案来获取用户帖子的所有评论?

3 个答案:

答案 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)