Я использую Rails 3.0.11
с MySQL 5.1
, и сегодня я понял, что он генерирует неожиданный оператор SQL при вызове count
для ActiveRecord::Relation
.
Подробнее:
У меня есть модель 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)
Thisэто действительно сюрприз для меня.Я ожидаю:
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)
Знаете ли вы, почему этоcase?
Как заставить его генерировать COUNT(*)
вместо COUNT(DISTINCT `profiles`.`id`)
?
Я пробовал
p.count(:select => "*")
, но это не работает.