PGError:错误:对象的AR查询及其has_many对象的WHERE子句中不允许聚合
在has_many关联上运行以下查询。 建议has_many批准。
我正在运行rails 3和PostgreSQL:
Recommendation.joins(:approvals).where('approvals.count = ? AND recommendations.user_id = ?', 1, current_user.id)
这将返回以下错误: https : //gist.github.com/1541569
错误消息告诉您:
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
表的主键就足够了(假设suggest.id 是 PK)。 在9.1之前的Postgres版本中,您必须包括SELECT
列表中未在GROUP BY
列表中聚合的所有列。 使用SELECT
列表中的recommendations.*
,这将是表的每一列。
我引用了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
先验相乘,然后您不必将它们聚合回来。
看起来你有一个名为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
列重命名为其他内容,以便您不必再担心它了。
- ActiveRecord和ActiveRecord :: Relation对象之间的区别
- 基于params的动态ActiveRecord查找器方法链接
- 通过以下方式进行多对多:从Associations :: CollectionProxy到AssociationRelation
- 在Rails 3中查找_or_create_by并更新以创建记录
- HOWTO在Ruby on rails上按平衡对项目进行排名
- Rails / ActiveRecord – AdapterNotSpecified,即使它是
- 如何validation提交ActiveRecord的单个属性而不是其所有属性?
- ActiveRecord模型中的复杂关联
- 我如何在sinatra的ruby中使用类似的查询?