2011-05-20 18 views
9

¿Cómo puedo limitar el número de filas devueltas en una relación con muchos? Por ejemplo:limite el número de objetos devueltos en un has_many

class User < ActiveRecord::Base 
    has_many :photos 
end 

Quiero ser capaz de hacer:

User.includes(:photos => {:limit => 8}).all 

Este trabajo, obviamente, no funciona, sino algo con esta funcionalidad. ¿Debo escribir el SQL yo mismo?

¡Gracias de antemano!

EDIT: No quiero limitar la asociación, solo los resultados de la consulta. Para que un usuario pueda tener mil fotos, solo quiero que se devuelvan las 3 principales.

Respuesta

2

Sólo tiene que añadir una opción de límite a la asociación has_many:

class User < ActiveRecord::Base 
    has_many :photos, :limit => 8 
end 

EDITAR

De acuerdo a sus necesidades:

class User < ActiveRecord::Base 
    has_many :all_photos, :class_name => "Photo" 
    has_many :photos, :limit => 8 
end 

nota: 'clase' cambiado a 'class_name' en all_photos associa

+0

No quiero limitar la asociación, solo las filas devueltas en la consulta ... – hb922

+0

SÍ limita las filas devueltas. Sin embargo, podría simplemente seleccionar los 8 mejores resultados de la asociación has_many -> "@ user.photos [0..7]" – ronnieonrails

+0

Quiero poder hacer esto usando la carga ansiosa, de esa manera puedo obtener los primeros 1000 registros con solo las primeras 3 asociaciones en cada modelo ... – hb922

2

Puede poner :limit en la declaración real has_many.

class User < ActiveRecord::Base 
    has_many :photos, :limit => 8 
end 
+4

¿Cómo hago esto por consulta en lugar de en el modelo? – hb922

9

No es necesario codificar el límite en el modelo. Puede llamar al @user.photos.limit(8). También puede llamar al @user.photos.scoped para obtener un objeto de alcance que realiza una carga diferida. La cosa devuelta desde @user.photos puede parecerse mucho, muy similar a Array, pero no lo es, ¡le corresponde a usted!

Ver http://apidock.com/rails/ActiveRecord/Associations/CollectionProxy para un viaje interesante en el agujero de conejo - lo vuelvas está delegando casi todas las llamadas estándar de inspección de objetos (class, singleton_class, methods, method, etc.) a un objeto Array, pero es delegar un cierto conjunto de llamadas a un objeto ActiveRecord::Associations::*. Es por eso que si llamas al @user.photos.method(:<<) te dirá que está usando #<Method: Array#<<>, pero en realidad no está usando eso, ¡está usando el de ActiveRecord::Associations::CollectionProxy!

Cuestiones relacionadas