2011-11-06 12 views
5

Parece una consulta simple pero no puedo solucionarlo.Asociación de carga ansiosa pero límite de retorno

Básicamente se reduce al antiguo concepto de categorías que tienen publicaciones. Las asociaciones esperadas están en su lugar, una categoría tiene muchas publicaciones mientras que una publicación pertenece a una categoría.

Quiero recuperar todas las categorías con sus puestos, pero limitar el número de mensajes a 10.

¿Alguna idea?

Respuesta

1

Esto no es algo que se pueda hacer con SQL sin procesar, ya que los LIMIT se encuentran en el tamaño total del conjunto de datos, nada más.

La única manera de hacer esto puramente por SQL es crear una columna de identificación falsa en su unión y filtro que cuando aparece, que es algo que depende de la implementación del servidor de base de datos que está utilizando.

Las alternativas, ya sea obtener todas las categorías y publicaciones y cortar el conjunto de registros, o obtener todas las categorías y obtener iterativamente 10 puestos como Joerg sugiere.

0

¿Necesita recuperarlos todos en una declaración SQL? ¿O está bien cargarlos perezosos cuando los necesitas?

En cuyo caso

Category.all 

conseguirá todas sus categorías, y paso a paso a través de ellos para obtener sus mensajes podrían ser simplemente

Category.all.each do |category| 
    category.posts.limit(10) 
end 

¿No sería esto suficiente?

+0

Estoy tratando de evitar las consultas N + 1, así es como está funcionando actualmente, pero significa que se realizan muchas consultas para representar la página cuando podría (creo) realizarse en 1 consulta. –

+0

No creo que eso sea posible por desgracia, ya que, como dijo Neil, el límite se aplica a todo el conjunto de datos. Posiblemente podría construir una instrucción SQL (dependiendo de su base de datos y su versión) recopilando las publicaciones en subconsultas con límite, pero podría resultar una cantidad de esfuerzo similar para su DB, sin embargo, con una posible penalización de legibilidad. Tampoco sugeriría obtener todos los datos en un solo conjunto de datos, y luego en Ruby cortarlo según sus requisitos, lo que resultaría en un impacto de rendimiento masivo como cada objeto, y muchos objetos innecesarios necesitarán ser instanciados. – Joerg

Cuestiones relacionadas