2015-12-27 108 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是唯一的。不過,如果你加入了別的東西,那可能是有道理的。

相關問題