列“pg_search _ ***”必须出现在GROUP BY子句中或用于聚合函数

时间:2015-12-27 21:13:59

标签: ruby-on-rails ruby-on-rails-3 postgresql pg pg-search

Tool.select('tools.id, tools.name').search('f')

以上查询工作正常,但

Tool.select('tools.id, tools.name').group('tools.id').search('f')

产生错误

ActiveRecord::StatementInvalid: PG::GroupingError: ERROR:  column
"pg_search_3aaef8932e30f4464f664f.pg_search_469c73b9b63bebacc2607f"
must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: ...xt, '')), 'D') || to_tsvector('english',
coalesce(pg_search_...

我正在使用pg_search(https://github.com/Casecommons/pg_search)gem进行全文搜索.. 我无法弄清楚即使尝试添加

的原因
group("tools.id, tools.*, #{PgSearch::Configuration.alias('tools')}.rank")

如我所读,但仍有同样的错误。
构建查询的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

PG要求所有选定的字段要么出现在GROUP BY子句中,要么出现在聚合函数中(例如:max,min) - 当然,如果你正在进行任何分组。

我猜测pg_search gem迁移在名为pg_search_469c73b9b63bebacc2607f的表上创建了一个名为pg_search_3aaef8932e30f4464f664f的字段,该字段是查询的一部分,但不属于GROUP BY的一部分子句。

我无法看到#{PgSearch::Configuration.alias('tools')}.rank如何转化为pg_search_3aaef8932e30f4464f664f.pg_search_469c73b9b63bebacc2607f

尝试使用group("tools.id, tools.name, pg_search_3aaef8932e30f4464f664f.pg_search_469c73b9b63bebacc2607f"),看看你是否摆脱了这个错误。如果有效,请尝试找一种检索pg_search_469c73b9b63bebacc2607f字段名称的程序方法。

鉴于你的例子,假设tools.id是唯一的,我不认为按id分组对你有好处。如果你加入其他东西,那么它就有意义了。