【问题标题】:using pg_search with apartment gem将 pg_search 与公寓 gem 一起使用
【发布时间】:2016-06-22 06:13:30
【问题描述】:

我正在尝试将 pg_search gem 与公寓 gem 启用的多租户应用程序结合使用。 Apartment 将我的数据与每个租户的模式分开。使用 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;

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-11
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多