2011-11-06 18 views
5

Sembra una query semplice ma non riesco a individuarla.Eager associazione di caricamento ma limite di restituzione

Fondamentalmente si riduce al concetto vecchio di categorie con post. Le associazioni previste sono in atto, una categoria ha_molti post mentre un post appartiene a una categoria.

voglio recuperare tutte le categorie con i loro messaggi, ma limitare il numero di posti a 10.

Tutte le idee?

risposta

1

Questo non è qualcosa che si può fare con SQL crudo come il limite di sono sulla dimensione totale del set di dati, non altro.

L'unico modo per farlo puro SQL è quello di creare una colonna id falso nel vostro unirsi e filtro rispetto a quando si esce che è qualcosa che l'attuazione è saggio incredibilmente dipende dal server di database che si sta utilizzando.

Le alternative come ottenere tutte le categorie e post e tagliare il recordset verso il basso, o ottenere tutte le categorie e iterativamente ottenere 10 messaggi come suggerisce Joerg.

0

È necessario recuperarli tutti in un'unica istruzione SQL? O è giusto caricarli pigri quando ne hai bisogno?

Nel qual caso

Category.all 

otterrà tutte le categorie, e passando attraverso loro di ottenere i tuoi messaggi potrebbero essere semplicemente

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

Sarebbe questo non essere sufficiente?

+0

Sto cercando di evitare le query N + 1, ovvero come funziona attualmente, ma significa che molte query vengono eseguite per il rendering della pagina quando potrebbe essere (credo) essere eseguita in 1 query. –

+0

Purtroppo non penso che sarà possibile - come, come ha detto Neil, il limite è applicato all'intero set di dati. Si potrebbe eventualmente costruire un'istruzione SQL (a seconda del DB e della versione) che raccoglie i post nelle sottoquery con limite - ma potrebbe essere una quantità simile di sforzo per il DB, tuttavia, con una possibile penalità di leggibilità. Inoltre, non suggerirei di ottenere tutti i dati in un set di dati, e poi in Ruby tritarli secondo le tue esigenze - ciò comporterebbe un enorme impatto sulle prestazioni di ogni oggetto - e molti oggetti non necessari dovranno essere istanziati. – Joerg

Problemi correlati