2016-06-21 3 views
0

私はアパートの宝石によって可能になったマルチテナントアプリケーションと組み合わせてpg_search宝石を使用しようとしています。アパートメントはテナントごとにスキーマを使用してデータを分離します。各テナントの検索は、pg_searchのデフォルト設定でうまくいくが、pg_trgmを有効にして使用するのに問題がある。アパートの宝石でpg_searchを使用

データベースの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; 

任意の助けをいただければ幸いです! ありがとう

答えて

0

私は何が間違っているかを見つけました。多分それはいつか誰かを助けることができます。

Postgresデータベース用に多数のスキーマを持つことができますが、いずれかのスキーマでのみ拡張機能を有効にすることができます。私はすでにすべての検索パスに含まれていないスキーマに対してpg_trgmを有効にしていたため、shared_extensionsスキーマの拡張機能のインストールに失敗しました。

私はこれに私のrakeタスクを変更:

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 
関連する問題