我正在使用Rails 3.0.11
和MySQL 5.1
,今天我意识到在count
上调用ActiveRecord::Relation
时会生成意外的SQL语句。
更多详情:
我的模型Profile
属于Account
。假设我执行以下操作:
p = Profile.includes(:account).where("accept_threshold >= 0")
p.count
(accept_threshold
是Profile
)的属性
生成的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 => "*")
但它不起作用。
答案 0 :(得分:0)
如果不进行计数,则会计算account
为accept_threshold
的{{1}}条记录的数量。
您的>= 0
条记录数为<{1}},不是profile
条记录的数量。