Почему Rails ActiveRecord генерирует 'count (отличный model.id)' для '.count', когда используется 'include' - PullRequest
0 голосов
/ 10 февраля 2012

Я использую 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 => "*") 

, но это не работает.

1 Ответ

0 голосов
/ 10 февраля 2012

Если бы это число не отличалось, это было бы число account записей, где accept_threshold равно >= 0.

Вы после подсчета profile записей, не количество account записей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...