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))
Vielleicht 'Kommentar.where (post_id:'? – hlcs