PGError:错误:对象的AR查询及其has_many对象的WHERE子句中不允许聚合

TJ *_*ill 2 postgresql activerecord ruby-on-rails count ruby-on-rails-3

在has_many关联上运行以下查询.建议has_many批准.

我正在运行rails 3和PostgreSQL:

Recommendation.joins(:approvals).where('approvals.count = ?
                      AND recommendations.user_id = ?', 1, current_user.id)
Run Code Online (Sandbox Code Playgroud)

这将返回以下错误:https://gist.github.com/1541569

Erw*_*ter 5

错误消息告诉您:

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
Run Code Online (Sandbox Code Playgroud)

使用PostgreSQL 9.1或更高版本,对于表GROUP BY主键(假设recommendations.id PK)就足够了.在9.1之前的Postgres版本中,您必须包括未在列表中聚合的列表的所有列.随着在列表中,这将是该表中的每一单个列.SELECTGROUP BYrecommendations.*SELECT

我引用了PostgreSQL 9.1发行说明:

GROUP BYGROUP BY子句中指定主键时允许查询目标列表中的非列(Peter Eisentraut)

使用子选择更简单

无论哪种方式,这都更简单,更快,做同样的事情:

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

避免JOIN使用先验乘以行,然后您不必将它们聚合回来.