为什么Rails ActiveRecord在使用'includes'时为'.count'生成'count(distinct model.id)'

时间:2012-02-10 15:39:54

标签: mysql ruby-on-rails-3 activerecord

我正在使用Rails 3.0.11MySQL 5.1,今天我意识到在count上调用ActiveRecord::Relation时会生成意外的SQL语句。

更多详情:

我的模型Profile属于Account。假设我执行以下操作:

p = Profile.includes(:account).where("accept_threshold >= 0")
p.count

accept_thresholdProfile)的属性

生成的SQL语句是:

SELECT COUNT(DISTINCT `profiles`.`id`) FROM `profiles` LEFT OUTER JOIN `accounts` ON `accounts`.`id` = `profiles`.`account_id` WHERE (accept_threshold >= 0)

这对我来说真是一个惊喜。我希望:

 SELECT COUNT(*) FROM `profiles` LEFT OUTER JOIN `accounts` ON `accounts`.`id` = `profiles`.`account_id` WHERE (accept_threshold >= 0)

另一方面,下面的代码:

p = Profile.where("accept_threshold >= 0")
p.count

产生

SELECT COUNT(*) FROM `profiles` WHERE (accept_threshold >= 0)

你知道为什么会这样吗?

如何强制它生成COUNT(*)而不是COUNT(DISTINCT `profiles`.`id`)

我试过了

p.count(:select => "*") 

但它不起作用。

1 个答案:

答案 0 :(得分:0)

如果不进行计数,则会计算accountaccept_threshold的{​​{1}}条记录的数量。

您的>= 0条记录数为<{1}},profile条记录的数量。