2015-09-17 13 views
5

Wenn ich eine Sammlung von Post s habe, gibt es sowieso alle Comment s für alle diese Beiträge mit Methode Verkettung oder Bereiche?Alle Kinder der Sammlung mit has_many Beziehung

Zum Beispiel:

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

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

Antwort

2

Der beste Weg:

Comment.joins(:post).where(post: {published: true}) 

oder wenn Sie eine posts Variable haben, die eine ActiveRecord Beziehung ist:

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

Sicher, es gibt ein paar Möglichkeiten. Sie können map und flatten verwenden, was für eine kleine Anzahl von Datensätzen in Ordnung ist. Stellen Sie sicher, dass Sie die Kommentare in großen Mengen laden, indem Sie includes verwenden.

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

Oder Sie können eine Verknüpfung verwenden. Dies bringt mehr Arbeit in die Datenbank, was wahrscheinlich schneller ist, aber abhängig von Ihrem Schema und Dataset. Normalerweise möchten Sie uniq verwenden, um Duplikate zu verhindern.

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

Auch, stellen Sie sicher, dass Sie in vollem Umfang alle expliziten Fragmente in irgendwelchen Klauseln zu verknüpften Tabellen qualifizieren, z.B. Verwenden Sie where('posts.created_at < ?', ...) anstelle von where('created_at < ?', ...).

Edit:

Eine weitere Variante auf der ersten, falls Sie eine Beziehung zurückkehren wollen (was weiter die Linie scoped werden kann nach unten):

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

Vielleicht 'Kommentar.where (post_id:'? – hlcs

Verwandte Themen