comptage d'association désireux de chargement avec Arel (Rails 3)
-
25-09-2019 - |
Question
Tâche simple: étant donné qu'un article a beaucoup de commentaires, pouvoir afficher dans une longue liste d'articles combien de commentaires chaque article a. Je suis en train de travailler sur la façon de précharger ces données avec Arel.
La section "agrégations complexe" du fichier README semble pour discuter de ce type de situation, mais il ne propose pas exactement un exemple de code, et n'offre une façon de le faire en deux requêtes au lieu d'une requête a rejoint, ce qui est pire pour la performance.
Dans le cas suivant:
class Article
has_many :comments
end
class Comment
belongs_to :article
end
Comment puis-je précharger un article mis combien de commentaires ont chacun?
La solution
Vous pouvez faire quelque chose de méchant en utilisant SQL comme:
default_scope :select => 'articles.*, (select count(comments.id) from comments where comments.article_id = articles.id) as count_comments'
et alors vous avez accès à Article.first.count_comments.
Une autre (plus agréable) méthode pour le faire est d'utiliser la fonction / option 'counter_cache' belongs_to association .
Autres conseils
Tu ne peux pas utiliser le cache de compteur pour cela?
belongs_to :article, :counter_cache => true
Vous devez également avoir une migration qui ajoute la colonne comments_count