conteggio associazione ansioso-caricamento con Arel (rotaie 3)
-
25-09-2019 - |
Domanda
compito semplice: dato che un articolo ha molti commenti, in grado di visualizzare in una lunga lista di articoli quanti commenti ogni articolo ha. Sto cercando di capire come precaricare questi dati con Arel.
La sezione "Complesso aggregazioni" del file di README sembra per discutere di quel tipo di situazione, ma non esattamente offrono codice di esempio, né offre un modo per farlo in due query al posto di uno di query uniti, che è peggio per le prestazioni.
Dato il seguente:
class Article
has_many :comments
end
class Comment
belongs_to :article
end
Come posso precarico per un set articolo quanti commenti ognuno ha?
Soluzione
Si può fare qualcosa di brutto utilizzando SQL come:
default_scope :select => 'articles.*, (select count(comments.id) from comments where comments.article_id = articles.id) as count_comments'
e quindi si avrebbe accesso a Article.first.count_comments.
Un altro metodo (più bello) per farlo è quello di utilizzare il 'counter_cache' funzione / opzione belongs_to associazione.
Altri suggerimenti
Non puoi utilizzare la cache contatore per questo?
belongs_to :article, :counter_cache => true
È inoltre necessario disporre di una migrazione che aggiunge la colonna comments_count