2015-09-17 88 views
5

如果我有一個Post s的集合,是否有無法使用方法鏈或範圍獲取所有這些帖子的所有Comment通過has_many關係獲取收集的所有孩子

例如:

posts = Post.where(published: true) 
comments = posts.comments 

# vs 
comments = [] 
posts.each do |post| 
    comments.push(post.comments) 
end 

回答

2

最好的辦法:

​​

或者如果你有一個posts變量是一個ActiveRecord關係:

Comment.joins(:post).where(post: posts) 
2

當然,也有一些方法。您可以使用mapflatten,對於少量記錄可以使用。請確保您使用includes批量加載評論。

Post.where(published: true).includes(:comments).map(&:comments).flatten 

或者您可以使用連接。這會在數據庫上增加更多的工作,這可能會更快,但取決於您的模式和數據集。您通常需要使用uniq來防止重複。

posts = Post.where(published: true) 
Comment.joins(:post).merge(posts).uniq 

此外,請確保您完全限定連接表上任何子句中的任何顯式片段,例如,使用where('posts.created_at < ?', ...)而不是where('created_at < ?', ...)

編輯:

第一另一變型,如果你想返回的關係(可進一步作用域的路線):

Comment.where(id: Post.where(published: true).pluck(:id)) 
+0

也許'Comment.where(post_id:'? – hlcs