Ошибка PostgreSQL при группировке и поиске с полнотекстовым поиском в SmartListing Gem - PullRequest
0 голосов
/ 22 марта 2019

Я использую умный список со списком postgresql в приложении rails. В таблице показан список элементов результата ассоциации, который в некоторых случаях элементы могут повторяться, но мне нужно показать этот элемент только один раз в таблице, но когда я добавляю DISTINCT или uniq к активной записи, он преобразуется в массив и умный листинг показывает и ошибку. Тогда я попытался решить это, используя gruop, и ЭТО РАБОТАЕТ! но когда я попытался выполнить полнотекстовый поиск с использованием pg_scope, запрос pg вылетел. Вот код:

class Prospect < ActiveRecord::Base
  include PgSearch
  pg_search_scope :search_by_name,
                  against: [:name, :father_last_name, :mother_last_name],
                  associated_against: { user: [:first_name, :father_last_name,
                                               :mother_last_name] },
                  ignoring: :accents

  has_many :projects, through: :project_prospects, dependent: :destroy
  .
  .
  .
class User < ActiveRecord::Base
  has_many :project_prospect
  has_many :projects, through: :user_projects, dependent: :nullify
end

Запрос

search = User.find(id).prospects.select("prospects.*").group("prospects.id")
search = search.search_query("Say my name") if search_full_text.present? 

Группа работает для удаления дубликатов в активной записи, но когда требуется полнотекстовый поиск, я получаю следующую ошибку

PG::GroupingError: ERROR:  column "pg_search_ece0055f6ad1de91cd168e.rank" must appear in 
the GROUP BY clause or be used in an aggregate function 

LINE 1: ...168e.pg_search_id GROUP BY prospects.id  ORDER BY pg_search_...

1 Ответ

0 голосов
/ 22 марта 2019

После нескольких часов поиска единственным решением этой проблемы было создание группы после полнотекстового поиска и добавление переменной с именем «rank» к запросу в SELECT, например:

search = User.find(id).prospects
if search_full_text.present? 
    search = search.search_query("Say my name")
                   .select("prospects.*").group("prospects.id, rank")
else
    search = search.select("prospects.*").group("prospects.id")
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...