2014-04-29 13 views
9

Angenommen, ich habe vier Modelle, Gruppen, Benutzer, Beiträge und Kommentare in meiner Rails 3 App. Die Beziehung ist:Mehrere verschachtelte Includes in Rails

Groups has_many Users 
Users has_many Posts 
Posts has_many Comments 

(und alle mit belongs_to in der anderen Richtung)

Wie bekomme ich alle Kommentare, die in einer Abfrage zu einem group.id gehört? kann ich nicht denken an mehrere enthält mit stop() (aber bisher ohne Erfolg) wie

comments = Comment.includes(:Post).includes(:User).includes(:Group).where("groups.id IS ?", group.id) 

Antwort

6

Sie eager_load Methode verwenden:

comments = Comment.eager_load(post: {user: :group}).where('groups.id = ?', group.id) 

Sie weitere Informationen über diese Art von Abfragen finden in diesem blog post.

+0

enthält, kann es nicht mit 'includes' gearbeitet werden? – Pavan

+0

@Pavan es funktioniert, aber es ist in Rails 4 veraltet. –

+0

Es gibt keinen Grund, 'eager_load' über' includes' hier zu verwenden, und es kann die Ergebnisse abhängig von den Bedingungen ändern. –

8

Sie tun können, noch mit

comments = Comment.includes(post: {user: :group}).where('groups.id = ?', group.id) 

Sehen Sie diese topic in Rails 4.1 Guides