2014-04-29 15 views
9

Załóżmy, że mam cztery modele, Grupy, Użytkownicy, Posty i Komentarze w mojej aplikacji Rails 3. Relacja jest:Wiele zagnieżdżonych zawiera w Railsach

Groups has_many Users 
Users has_many Posts 
Posts has_many Comments 

(i wszystko z belongs_to w drugim kierunku)

Jak uzyskać wszystkie komentarze, które należy do group.id w jednej kwerendzie? Nie mogę przestać myśleć o użyciu zawiera wiele() (ale bez powodzenia tej pory) jak

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

Odpowiedz

6

Można użyć eager_load metody:

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

można znaleźć więcej informacji na temat tego typu zapytań w tym blog post.

+0

nie może być pracowali z 'includes'? – Pavan

+0

@Pavan działa, ale jest przestarzały w Railsach 4. –

+0

Nie ma powodu, aby używać 'eager_load' zamiast' includes', i może zmieniać wyniki w zależności od warunków. –

8

nadal można zrobić ze zawiera

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

Zobacz ten topic w Rails 4.1 Przewodników

Powiązane problemy