我有一个模型用户,它有很多帖子。要查询前5个用户,我会这样做:
User.all :limit => 5
返回一个好的用户,但是当获得每个用户拥有的帖子数量时,它会再次查询数据库:
a_user.posts.count
有没有办法可以避免此查询并使用第一个查询获取计数?我正在遍历用户,并且每次查询用户的帖子计数时都会阻止。
答案 0 :(得分:4)
Rails有一个内置方法,在声明像has_many这样的关联时必须设置为true,并且还必须在数据库中添加一列。
在声明counter_cache: true
关联
has_many
将#{table_name}_count
添加到数据库中,它将自动递增和递减,因此您可以在查询前五个用户时直接选择此列。
更多信息:
http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html
答案 1 :(得分:3)
您正在寻找rails eager loading #includes
的方法,它仍然会创建两个查询(但如果您执行User.all, :limit=>5
然后user.posts
则不会创建6个查询),但是将在一个查询中加载帖子:
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
中找到此信息