2011-11-10 16 views
5

Nie wiem, czy jest na to dobra odpowiedź. Powiedzmy, że mam:Szyny: Zależność od tablicy obiektów

users = User.where(:location => "Utopia") #=> Returns [user1,user2,user3,user4] 

chciałbym zrobić coś takiego:

users.photos #=> Returns all photos this group of users has 

I po prostu uzyskać wszystkie zdjęcia z powrotem bez iteracji nad nimi. Pytam, ponieważ każda iteracja jest wywołaniem DB. Czy istnieje jakiś dobry sposób, aby wywołać pojedyncze wywołanie DB?

Odpowiedz

5

Najprostszym sposobem, aby to zrobić jest użycie chętny ładowarka:

users = User.where(:location => 'Utopia').includes(:photos) 

To będzie pobierał użytkowników w jednym przejściu, to relacje i związane z nimi zdjęcia w innym. Można owinąć to wszystko w jednej rozmowy, jeśli albo użyć JOIN lub podselekcji, to twoja decyzja, ale będzie to wyglądać mniej więcej tak:

photos = Photo.includes(:user).where('users.location' => 'Utopia') 

Jest więcej informacji dostępnych w Active Record Query Interface documentation w sekcji 12.

+1

Tak, byłoby trochę bardziej wydajne niż łączenie wewnętrzne niż LOJ - 'photos = Photo.joins (: user) .where (: users => {: location => 'Utopia'})' – mnelson

+0

Czy jest możliwe określenie, którego klucza chcę użyć podczas wykonywania łączenia? Relacja jest konfigurowana przez ': has_many: through', a return używa niewłaściwego zestawu kluczy. – Justin

Powiązane problemy