在PostgreSQL中急切加载和分组

时间:2011-08-30 17:16:34

标签: ruby-on-rails ruby ruby-on-rails-3 eager-loading rails-postgresql

我知道PostgreSQL与MySQL不同,它要求在使用聚合函数时列出group by子句中的所有选定字段,例如

Transaction.select('sum(amount), category_id').group('category_id')

足够公平。但是当我试图加载一个关联时,例如

Transaction.select('sum(amount), categories.name').includes(:category).group('categories.name')

它不起作用,因为你没有在group by子句中包含两个模型的所有字段。

有没有办法避免列出模型的所有字段,还是应该考虑接受N + 1个查询? (当我只需要2 ...时,我不认为列出30个字段是有意义的。)

1 个答案:

答案 0 :(得分:1)

从PostgreSQL的新版本开始(如果我没记错的话,可以使用9.1+),您只能按表格的主键进行分组。以前的版本(以及大多数RDBMS)要求您提供所有列。仅限密钥的异常是有效的,因为我们知道所有属性在功能上都依赖于密钥,所以如果密钥发生变化,其他属性无论如何都将是不同的。

MySQL是一个例外,正如弗兰克在上面的评论中指出的那样。在这种情况下,这对该数据库的许多非确定性方面负责。非确定性通常很糟糕,应该避免。