如果我有一個Post
s的集合,是否有無法使用方法鏈或範圍獲取所有這些帖子的所有Comment
?通過has_many關係獲取收集的所有孩子
例如:
posts = Post.where(published: true)
comments = posts.comments
# vs
comments = []
posts.each do |post|
comments.push(post.comments)
end
如果我有一個Post
s的集合,是否有無法使用方法鏈或範圍獲取所有這些帖子的所有Comment
?通過has_many關係獲取收集的所有孩子
例如:
posts = Post.where(published: true)
comments = posts.comments
# vs
comments = []
posts.each do |post|
comments.push(post.comments)
end
最好的辦法:
或者如果你有一個posts
變量是一個ActiveRecord關係:
Comment.joins(:post).where(post: posts)
當然,也有一些方法。您可以使用map
和flatten
,對於少量記錄可以使用。請確保您使用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))
也許'Comment.where(post_id:'? – hlcs