использование pg_search с жемчужиной квартиры

Я пытаюсь использовать гем pg_search в сочетании с многопользовательским приложением, поддерживаемым гемом квартиры. Квартира разделяет мои данные со схемой для каждого арендатора. Поиск внутри каждого клиента хорошо работает с настройками по умолчанию pg_search, но у меня проблемы с его использованием с включенным pg_trgm.

Я включил расширение pg_trgm в своей базе данных, добавив отдельную схему под названием «общие расширения» и включив для нее расширение pg_trgm. Эта схема всегда включается в путь поиска при настройке квартиры:

config.persistent_schemas = %w{ shared_extensions }

Но когда я пытаюсь выполнить поиск модели по триграмме, я получаю сообщение об ошибке.

pg_search_scope :search_by_name, against: :name, using: :trigram

Meeting.search_by_name('blabla').first

PG::UndefinedFunction: ERROR:  operator does not exist: text % unknown

Это заставляет меня думать, что pg_trgm не был включен правильно, однако я могу выполнить следующий запрос в своей базе данных без проблем:

SELECT name, similarity(name, 'blabla') AS sml
FROM aa.meetings
WHERE name % 'blabla'
ORDER BY sml DESC, name;

Любая помощь будет оценена по достоинству! Спасибо


person wiiiim    schedule 21.06.2016    source источник


Ответы (1)


Я выяснил, в чем дело. Возможно, когда-нибудь это кому-нибудь поможет.

Хотя у вас может быть много схем для базы данных Postgres, вы можете включить расширения только в одной из схем. У меня уже был включен pg_trgm для схемы, которая не была включена в каждый путь поиска, поэтому установка расширения для схемы shared_extensions не удалась.

Я изменил свою задачу по граблям на это:

namespace :db do

desc 'Create shared_extensions Schema'
  task :extensions => :environment  do
    ActiveRecord::Base.connection.execute 'DROP EXTENSION IF EXISTS "pg_trgm"'
    ActiveRecord::Base.connection.execute 'CREATE SCHEMA IF NOT EXISTS shared_extensions;'
    ActiveRecord::Base.connection.execute 'CREATE EXTENSION "pg_trgm" SCHEMA shared_extensions;'
  end
end

Rake::Task["db:create"].enhance do
  Rake::Task["db:extensions"].invoke
end

Rake::Task["db:test:purge"].enhance do
  Rake::Task["db:extensions"].invoke
end
person wiiiim    schedule 21.06.2016