Activerecord查询包括关联计数

我有一个模型用户,它有很多post。 要查询前5个用户,我这样做:

User.all :limit => 5 

返回一个好的用户,但是当获得每个用户拥有的post数量时,它再次查询数据库:

 a_user.posts.count 

有没有办法可以避免这个查询并通过第一个查询得到计数? 我正在遍历用户,并且每次查询用户的post计数时都会阻止。

Rails有一个内置方法,在声明has_many之类的关联时必须设置为true,并且还必须向数据库添加一列。

set counter_cache: true声明has_many关联时为counter_cache: true

#{table_name}_count添加到数据库,它将自动递增和递减,因此您可以在查询前五个用户时直接选择此列。

更多信息:

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

http://railscasts.com/episodes/23-counter-cache-column

你正在寻找rails eager loading #includes ,它仍会创建两个查询(但如果你做User.all, :limit=>5则不是6 User.all, :limit=>5 ,然后是每个user.posts ),但是会加载post在一个查询中:

 User.includes(:posts).limit(5) 

哪个应该创建SQL:

 SELECT * FROM users LIMIT 5 SELECT posts.* FROM posts WHERE (posts.user_id IN (1,2,3,4,5)) # Numbers are found ID 

您可以从Active Record查询指南中找到此信息