2015-07-21 69 views
2

模型Rails的ActiveRecord的查询连接多个表

class AdminUser < ActiveRecord::Base 
    has_many :users 
end 
class User < ActiveRecord::Base 
    has_many :posts 
end 
class Post < ActiveRecord::Base 
    has_many :comments 
end 

我想在这个ADMINUSER下的每个用户创建的每一个岗位的所有评论列表。

为了让每个用户完成1条评论,所有评论都很简单。我会用类似

comments=Comment.joins(:post).where("posts.user_id= ?",userid.to_s) 

但是在这里,我需要去更高一层。即获得每个用户在1个admin_user下发表的每条帖子的评论。我以前从未使用过多个连接,所以我有点困惑。

如果我可以用ActiveRecord的关联字符串内它可能看起来像

 comments=Comment.joins(:post).joins(:user).where("posts.user.admin_user.id=?",adminuser_id) 

但我不能用posts.user.admin_user

回答

0

应该是这样

Comment.joins(post: :user) 
+0

我认为,评论属于帖子和帖子属于用户。这就是为什么。 – Santanu

+0

阅读问题。 –

+0

是的,这是我正在寻找的连接。我的最终查询是Comment.joins(post: :user).where(“user.admin_user_id =?,admin_id) –

2

怎么样,我们首先获取用户的ID,其属于管理员用户,然后习惯于使用您的查询来选择评论。

user_ids = admin_user.users.pluck(:id) 
comments=Comment.joins(:post).where("posts.user_id IN (?)", user_ids) 

我假设你粘贴的问题的查询将工作。

+0

这工作,并感谢回答......但我想学习如何作为学习多的过程中加入这样做在1个语句,也是如此。请让我知道是否有办法在1行内完成。再次感谢... –

+0

可能是我的错,但我认为在这里它需要内部查询,我们将在其中获取user_id:post.user_id IN(内部查询,我们在其中获取与admin相关的用户)。 bcoz,我们需要将posts.user_id与所有user_id对应的管理员进行匹配。即时通讯不是很好的原始sql。:(我会帮你做到这一点:'comment = Comment.joins(:post).where(“posts.user_id IN(?)”,admin_user.users。 pluck(:id))' – Athar