ruby-on-rails - PGError : ERROR: aggregates not allowed in WHERE clause on a AR query of an object and its has_many objects

标签 ruby-on-rails ruby-on-rails-3 postgresql activerecord count

在 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 the GROUP 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/

相关文章:

mysql - 从模式中删除表而不从数据库中删除它?

ruby-on-rails - Controller 所有 Action 的相同实例变量

ruby-on-rails - Rails - 播种 HABTM 协会

database - Postgres 复制( native )是否支持每个数据库级别的复制?

postgresql - RDB 和 RDF 映射——怎么做?

ruby-on-rails - 如何解决 importmap 引导权限被拒绝的问题?

ruby-on-rails - `method_missing' : undefined method `mail' for Emailer:Class (NoMethodError)

ruby-on-rails - cat ~/.gemrc 结果为 "no such file or directory"

javascript - ajax:beforeSend 在任何 ajax 调用上被触发

postgresql - 在 PL/pgSQL 中插入后获取默认序列值