2015-12-27 45 views
1
Tool.select('tools.id, tools.name').search('f') 

上述查询工作正常,但列 “pg_search _ ***” 必须出现在GROUP BY子句或聚合函数中使用

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") 

正如在读我所提到的,但仍然是同样的错误。
框架查询的正确方法是什么?

回答

0

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

我猜一个pg_search宝石迁移创建了一个名为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是唯一的。不过,如果你加入了别的东西,那可能是有道理的。

相关问题