使用pg_search与apartment gem

时间:2016-06-21 04:15:59

标签: ruby-on-rails pg-search apartment-gem

我尝试将pg_search gem与公寓gem启用的多租户应用程序结合使用。公寓使用每个租户的架构分隔我的数据。使用每个租户进行搜索可以很好地使用pg_search默认设置,但我在启用pg_trgm的情况下无法使用它。

我已在数据库中启用了pg_trgm扩展名,方法是添加一个名为“共享扩展程序”的单独模式。并在其上启用pg_trgm扩展名。通过配置apartment:

,此架构始终包含在搜索路径中
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;

任何帮助将不胜感激! 感谢

1 个答案:

答案 0 :(得分:0)

我发现了什么问题。也许有一天它可以帮助别人。

虽然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