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
你正在寻找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查询指南中找到此信息