PGError: ERROR: агрегаты не допускаются в предложении WHERE для запроса AR объекта и его объектов has_many - PullRequest
2 голосов
/ 31 декабря 2011

Выполнение следующего запроса для ассоциации has_many. Рекомендации has_many Одобрения.

Я бегу, рельсы 3 и PostgreSQL:

Recommendation.joins(:approvals).where('approvals.count = ?
                      AND recommendations.user_id = ?', 1, current_user.id)

Это возвращает следующую ошибку: https://gist.github.com/1541569

Ответы [ 2 ]

5 голосов
/ 31 декабря 2011

Сообщение об ошибке сообщает вам:

агрегаты не допускаются в предложении WHERE

count() - агрегатная функция. Для этого используйте предложение HAVING .
Запрос может выглядеть так:

SELECT r.*
FROM   recommendations r
JOIN   approvals       a ON a.recommendation_id = r.id
WHERE  r.user_id = $current_user_id
GROUP  BY r.id
HAVING count(a.recommendation_id) = 1

В PostgreSQL 9.1 или более поздней версии достаточно GROUP BY первичный ключ таблицы (при условии, что recommendations.id равен PK). В версиях Postgres до 9.1 вы должны были включить все столбцы списка SELECT, которые не агрегированы в списке GROUP BY. С recommendations.* в списке SELECT это будет каждый столбец таблицы.

Я цитирую заметки о выпуске PostgreSQL 9.1 :

Разрешить не- GROUP BY столбцов в списке целей запроса, когда основной ключ указан в предложении GROUP BY (Peter Eisentraut)

Проще с дополнительным выбором

В любом случае, это проще и быстрее, делая то же самое:

SELECT *
FROM   recommendations r
WHERE  user_id = $current_user_id
AND   (SELECT count(*)
       FROM   approvals
       WHERE  recommendation_id = r.id) = 1;

Избегайте умножения строк на JOIN априори, тогда вам не нужно агрегировать их обратно.

1 голос
/ 31 декабря 2011

Похоже, у вас есть столбец с именем count, а PostgreSQL интерпретирует это имя столбца как агрегатную функцию count.Ваш SQL заканчивается следующим образом:

SELECT "recommendations".*
FROM "recommendations"
INNER JOIN "approvals" ON "approvals"."recommendation_id" = "recommendations"."id"
WHERE (approvals.count = 1 AND recommendations.user_id = 1)

Сообщение об ошибке конкретно указывает на approvals.count:

LINE 1: ...ecommendation_id" = "recommendations"."id" WHERE (approvals....
                                                             ^

Я не могу воспроизвести эту ошибку в моем PostgreSQL (9.0), номожет быть, вы используете другую версию.Попробуйте дважды заключить в кавычки имя этого столбца в вашем where:

Recommendation.joins(:approvals).where('approvals."count" = ? AND recommendations.user_id = ?', 1, current_user.id)

Если это все уладит, я бы порекомендовал переименовать ваш столбец approvals.count во что-то другое, чтобы вам не приходилось беспокоитьсяэто больше.

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