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;
どんな助けでも大歓迎です!ありがとう