rails缺少表的FROM子句条目(计算子项)

时间:2015-07-14 00:21:00

标签: ruby-on-rails postgresql

我有一个简单的父母has_many孩子的关系,我正在努力让所有父母少于n个孩子。

Parent.select("parents.id").joins(:children).group('parents.id').having('COUNT(children.id) < ?', n).reorder('parents.id')

不断出现的错误是:

SELECT parents.id FROM "parents" INNER JOIN "children" ON "children"."parent_id" = "parents"."id" GROUP BY parents.id HAVING count("children"."id") < 100
PG::UndefinedTable: ERROR:  missing FROM-clause entry for table "children"

从我在网上看到的,这应该是有效的。我搜索了许多相关问题的帖子,但没有一个答案似乎有关系。父子关系有一个范围用于排序,这就是我按父ID重新排序的原因。

我需要的“FROM-clause”条目是什么?

运行Rails 4.2和Postgres

1 个答案:

答案 0 :(得分:0)

我认为这里的问题是您的HAVING子句引用了某些内容 - children.id - 这在SELECT中不存在。在HAVINGGROUP BY之后评估SELECT,因此我相信它目前可用的内容仅为parents.id

有关详细信息,请参阅SELECT doc

因此,最终,您需要在SELECT中提供子ID项,然后在其上调用HAVING

想到一次完成这两件事的一种方法是使用count作为窗口函数

然后SQL会看到这个效果:

SELECT parents.id, count(children.id) over(partition by children.id) as children_id_count
FROM "parents"
INNER JOIN "children" ON "children"."parent_id" = "parents"."id"
WHERE count(children.id) over(partition by children.id) < 100
GROUP BY parents.id

注意:窗口函数需要在WHERE子句中重复,因为此时尚未创建别名。

AFAIK, Active Record 本身不支持窗口函数,因此您需要使用原始 SQL