在 has_many 关联上运行以下查询。推荐有_many批准。
我正在运行,rails 3 和 PostgreSQL:
Recommendation.joins(:approvals).where('approvals.count = ?
AND recommendations.user_id = ?', 1, current_user.id)
这将返回以下错误:https://gist.github.com/1541569
最佳答案
错误信息告诉你:
aggregates not allowed in WHERE clause
count()
是聚合函数。使用 HAVING clause为此。
查询可能如下所示:
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)。在 9.1 之前的 Postgres 版本中,您必须包含 SELECT
列表中未聚合到 GROUP BY
列表中的所有 列。对于 SELECT
列表中的 recommendations.*
,这将是表格的每一列。
我引用 release notes of PostgreSQL 9.1 :
Allow non-
GROUP BY
columns in the query target list when the primary key is specified in theGROUP BY
clause (Peter Eisentraut)
子选择更简单
无论哪种方式,这样做都更简单、更快捷:
SELECT *
FROM recommendations r
WHERE user_id = $current_user_id
AND (SELECT count(*)
FROM approvals
WHERE recommendation_id = r.id) = 1;
避免先验地将行与 JOIN
相乘,这样您就不必将它们聚合回去。
关于ruby-on-rails - PGError : ERROR: aggregates not allowed in WHERE clause on a AR query of an object and its has_many objects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8684486/