【问题标题】:Rails 4 pgsql add_index with type GIN or GiSTRails 4 pgsql add_index 类型为 GIN 或 GiST
【发布时间】:2013-09-14 12:38:41
【问题描述】:

在 Rails 中可以这样做:

add_index :table, :column_name, :using => 'btree'

是否可以在带有 PGSQL 的 Rails 4 中添加 GINGiST 索引,例如:

add_index :students, :name, :using => 'gin'

或者我有使用手动执行语句吗?这背后的概念是我想保留 schema.rb 而不是使用 structure.sql

【问题讨论】:

    标签: ruby-on-rails postgresql ruby-on-rails-4


    【解决方案1】:

    在 Rails 4 中,您现在可以在迁移中执行以下操作:

    add_index :products, :data, using: :gin
    

    【讨论】:

    • 有这方面的文档吗?我在 Stackoverflow 上看到了类似的答案,但 add_index :products, :data, using: :gin 在迁移中使用时会引发异常。
    • 这会引发错误PG::UndefinedObject: ERROR: data type character varying has no default operator class for access method "gin" ... 这是在 Rails 4.2 上。
    • 小修正,你还需要给一个配置作为属性,例如。 G。 “英语”:execute("CREATE INDEX some_name ON products USING gin(to_tsvector('english', 'data'))")
    • @King'oriMaina 在 Rails 5 中,您可以使用 opclass 参数来使用默认运算符类并避免该错误:add_index :products, :data, using: :gin, opclass: :gin_trgm_ops api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/…
    • 在此步骤上方的迁移中添加enable_extension "btree_gin"
    【解决方案2】:

    哇!我有几根头发变白了。我正在使用 rails 4.2 并尝试运行此迁移,它给了我与上述人员相同的错误。

    PG::UndefinedObject: ERROR: data type character varying has no default
    

    我发现你实际上仍然可以继续使用 schema.rb 而不必使用 config/application.rb

    config.active_record.schema_format = :sql
    

    我缺少的一件主要事情是安装 postgres contrib 模块。我假设 gin 和 gist 等功能已经打开。我从未注意到,但模块显示在您的 schema.rb 文件中。它们像这样出现在顶部

    ActiveRecord::Schema.define(version: 20151203234708) do
    
      # These are extensions that must be enabled in order to support this database
      enable_extension "plpgsql"
      enable_extension "pg_trgm"
      enable_extension "fuzzystrmatch"
      enable_extension "btree_gin"
      enable_extension "btree_gist"
    

    如果你没有看到启用 btree_gin,你就不能使用代码

    add_index :products, :data, using: :gin
    

    您可以通过像这样运行迁移来安装任何模块。更改将反映在您的 schema.rb

    class InstallSomeContribPackages < ActiveRecord::Migration
      def up
        execute "CREATE EXTENSION IF NOT EXISTS btree_gin;"
        execute "CREATE EXTENSION IF NOT EXISTS btree_gist;"
      end
    
      def down
        execute "DROP EXTENSION IF EXISTS btree_gin;"
        execute "DROP EXTENSION IF EXISTS btree_gist;"
      end
    end
    

    这里是postgres modules的列表

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    • 2014-01-02
    • 1970-01-01
    相关资源
    最近更新 更多