2016-06-28 67 views
0

我无法理解如何使用关联获取所有相关记录,而不是关联ID,如user_idcomment_id。 让我们假设我有三个型号User, Post, Comment, Image和协会是使用关联获取所有相关记录

User 
    has_many :posts 
    has_many :comments 

Post 
    belongs_to :user 
    has_many :comments 
    has_many :images 

Comment 
    belongs_to :user 
    belongs_to :post 

Image 
    belongs_to :post 

现在我的用户的user_id,并找到用户为:

@user = User.find_by_id(params[:id]) 
@comments = @user.comments 

现在我想与他们每个人一个的获取这些评论他们的帖子的相关记录。我希望发布散列,而不是每个评论对应的post_id。 我想在单个查询中执行此操作。 如果您有任何想法,请给我建议。

+0

尝试'@ user.comments.first.post',它会返回一个'POST'实例。谨防这种方法中的[“N + 1查询”](https://www.sitepoint.com/silver-bullet-n1-problem/)问题得到解决,但这不在您的问题范围之内。 – mudasobwa

+0

感谢您的考虑@mudasobwa。但我的问题是我想收集评论,而不是post_id,而且每个评论都有相应的帖子记录。我不想做一个循环来获取他们每个人的帖子 –

回答

2

使用includes(:association)

@user = User.find_by_id(params[:id]) 
@comments = @user.comments.includes(:post) 

注:这将使另一个(第二)查询。

另外,它包含在初始查询:

@user = User.where(id: params[:id]).includes(comments: :post) 
+0

对不起@ uzbekjon,这将导致关联名为'posts'的错误在评论中找不到。 –

+0

这是一个错字。因为它是'belongs_to'关联,所以将它改为'post'即可。 – Uzbekjon

+0

好的@Uzbekjon。这不会取代评论集合中的post_id。这将再次返回post_id而不是完整的后期哈希 –