2011-11-10 20 views
5

No sé si hay una buena respuesta para esto. Digamos que tengo:Rieles: obtener relación en una matriz de objetos

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

me gustaría hacer algo como:

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

y simplemente obtener todas las fotos de vuelta sin iterar sobre ellos. Lo pregunto porque cada iteración es una llamada a DB. ¿Hay alguna buena forma de hacer una sola llamada a DB?

Respuesta

5

La forma más sencilla de hacer esto es utilizar el cargador ansiosos:

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

que se capturen los usuarios en una sola pasada, luego las relaciones y sus fotos asociadas en otra. Puede envolverlo todo en una sola llamada, si bien utiliza una JOIN o una subselección, es su decisión, pero va a ser algo como esto:

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

Hay más información disponible en el Active Record Query Interface documentation en la sección 12.

+1

Sí, sería un poco más eficiente hacer una unión interna en lugar de un LOJ - 'photos = Photo.joins (: user) .where (: users => {: location => 'Utopia'})' – mnelson

+0

¿Es posible especificar qué tecla quiero usar al realizar la unión? La relación se configura a través de ': has_many: through' y la devolución utiliza el conjunto de claves incorrecto. – Justin

Cuestiones relacionadas