Activerecord查询包括关联计数

时间:2013-01-07 14:57:45

标签: ruby-on-rails ruby activerecord

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

User.all :limit => 5

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

a_user.posts.count

有没有办法可以避免此查询并使用第一个查询获取计数?我正在遍历用户,并且每次查询用户的帖子计数时都会阻止。

2 个答案:

答案 0 :(得分:4)

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

在声明counter_cache: true关联

时设置has_many

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

更多信息:

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

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

答案 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

您可以从Active Record Query Guide

中找到此信息