Rails SQL COUNT N + 1效率低下

Mik*_*ike 11 ruby sql ruby-on-rails

我有一个博客.在我的索引页面上,我提取所有博客帖子.对于每篇博文,我都会计算该帖子的评论数量.这导致N + 1问题.我的查询如下:

SELECT "blog_posts".* FROM "blog_posts" WHERE ("blog_posts"."published" = 't') ORDER BY published_at DESC
SELECT "users".* FROM "users" WHERE ("users"."id" IN (1, 2, 3)) 
SELECT COUNT(*) FROM "blog_comments" WHERE ("blog_comments".blog_post_id = 10)
SELECT COUNT(*) FROM "blog_comments" WHERE ("blog_comments".blog_post_id = 9)
SELECT COUNT(*) FROM "blog_comments" WHERE ("blog_comments".blog_post_id = 8)
SELECT COUNT(*) FROM "blog_comments" WHERE ("blog_comments".blog_post_id = 2)
SELECT COUNT(*) FROM "blog_comments" WHERE ("blog_comments".blog_post_id = 7) 
Run Code Online (Sandbox Code Playgroud)

Rails中是否有一种方法可以像我包含用户一样包含COUNT(SQL第2行)?

Hei*_*kki 21

您可以使用计数器缓存:http://guides.rubyonrails.org/association_basics.html#counter_cache

"通过此声明,Rails将使缓存值保持最新,然后返回该值以响应size方法."

class BlogPost < ActiveRecord::Base
  has_many :blog_comments
end

class BlogComment < ActiveRecord::Base
  belongs_to :blog_post, :counter_cache => true
end
Run Code Online (Sandbox Code Playgroud)

博客帖子会有一个名为的列blog_comments_count.