使用 pg_search 公寓 gem
using pg_search with apartment gem
我正在尝试将 pg_search gem 与公寓 gem 启用的多租户应用程序结合使用。公寓将我的数据与每个租户的模式分开。使用 pg_search 默认设置可以很好地搜索每个租户,但在启用 pg_trgm 的情况下我无法使用它。
我通过添加一个名为 'shared extensions' 的单独模式并在其上启用 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;
如有任何帮助,我们将不胜感激!
谢谢
我发现了问题所在。也许有一天它可以帮助某人。
虽然 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
我正在尝试将 pg_search gem 与公寓 gem 启用的多租户应用程序结合使用。公寓将我的数据与每个租户的模式分开。使用 pg_search 默认设置可以很好地搜索每个租户,但在启用 pg_trgm 的情况下我无法使用它。
我通过添加一个名为 'shared extensions' 的单独模式并在其上启用 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;
如有任何帮助,我们将不胜感激! 谢谢
我发现了问题所在。也许有一天它可以帮助某人。
虽然 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