ActiveRecord多个连接和计数

时间:2014-01-16 22:32:41

标签: ruby-on-rails postgresql activerecord

我有以下型号:

用户:

has_one :extraction

提取:

belongs_to: user
has_many :pages

页数:

belongs_to :extraction

现在我想返回所有用户和每个用户的页数。我希望在一个查询中使用它。

我的代码:

@users = User.
  joins("LEFT OUTER JOIN extractions on users.id = extractions.id INNER JOIN pages on extractions.id = pages.extraction_id").
  select("users.*").
  select("COUNT(pages.id) AS total_page_count").
  uniq("users.id").
  group("users.id").
  order(build_order_string).
  paginate(page: params[:page], per_page: custom_cookie_per_page_page_results)

返回其中一个测试用户有276个页面。而如果我手动执行代码,即User.find(1).extraction.pages.count,则会返回180。我做错了什么?

感谢。

2 个答案:

答案 0 :(得分:1)

这似乎过于复杂。这不会有诀窍:

# user.rb
has_one :extraction
has_many :pages, through: :extractions

然后使用页面加载用户:

@users = User.includes(:pages).order(...).paginate(...)

这只会生成两个查询,您可以按如下方式获取每个用户的页面数:

@users.each{ |user| puts user.pages.size }

答案 1 :(得分:1)

我有一个错字。

必须是:

joins("LEFT OUTER JOIN extractions on users.id = extractions.user_id INNER JOIN pages on extractions.id = pages.extraction_id").