0

pg_search gem を、アパートメント gem によって有効化されたマルチテナント アプリケーションと組み合わせて使用​​しようとしています。アパートメントは、データをテナントごとのスキーマで分離します。各テナント内での検索は 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;

どんな助けでも大歓迎です!ありがとう

4

1 に答える 1

2

何が悪いのかわかりました。いつか誰かの役に立てるかもしれません。

Postgres データベースには多くのスキーマを使用できますが、拡張機能を有効にできるのはスキーマの 1 つだけです。すべての検索パスに含まれていないスキーマに対して 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
于 2016-06-21T22:13:30.497 に答える