Cet article présente une petite astuce pour éviter les requêtes N+1 dues à l'utilisation de .count() dans ActiveRecord.

Commentaires

Effectivement, après on trouve un certain nombre de gems qui aident dans ce process.

On trouve par exemple bullet pour les N+1 https://github.com/flyerhzm/bullet

Il y a également scrooge mais on dirait que ça n'a pas été mis à jour de puis un moment https://github.com/methodmissing/scrooge

Il y a plus de 13 ans

Plutôt que de compter la taille d'un tableau, j'utiliserai plutôt un counter_cache sur article (http://guides.rubyonrails.org/association_basics.html#belongs_to-association-reference 4.1.2.4 :counter_cache ) ou alors un COUNT sur la jointure :

Article.joins(:comments).select('COUNT(DISTINCT comments.id) AS mon_super_count_de_comments').all.each {|a| puts a.mon_super_count_de_comments}

L'approche envisagée dans l'article n'est valide que si on a besoin d'instancier les commentaires pour en faire autre chose que le count et qu'on ne veut pas mettre en place de counter_cache. Ca me semble être une exception plutôt que la règle comme le laisse penser l'article.

Il y a plus de 13 ans

Héhé le count réserve des surprises !

Autre petit point que je rencontre (mongoid) c'est quand je fais @articles = Article.all dans le contrôleur puis @articles.count (ça lance une requête de comptage) puis @articles.each {} (ça lance une requête pour récupérer les articles). Ce sont les joies du "late eval" de l'ORM. Du coup je force l'exécution de la requête en faisant @articles = Article.all.entries et le count se fera sur le tableau. Il y a bien des cas où c'est parfait.

Il y a plus de 13 ans
Vous devez vous inscrire ou vous connecter pour poster un commentaire