3

我有一个迁移:

class AddGinIndexToContacts < ActiveRecord::Migration
  def up
    execute("CREATE INDEX contacts_search_idx ON contacts USING gin (first_name gin_trgm_ops, last_name gin_trgm_ops, name gin_trgm_ops)")
  end

  def down
    execute("DROP INDEX contacts_search_idx")
  end
end

它在以下位置生成此代码schema.rb

add_index "contacts", ["first_name", "last_name", "name"], name: "contacts_search_idx", using: :gin

后来,当我执行rake db:schema:load它时会生成错误的sql:

CREATE  INDEX  "contacts_search_idx" ON "contacts" USING gin ("first_name", "last_name", "name")

首先,它说:

错误:数据类型字符变化没有访问方法“gin”的默认运算符类

其次,有失gin_trgm_ops

如何使它起作用?

Rails 4.2

4

4 回答 4

5

您可以使用 order 参数来定义运算符类。

add_index "contacts", ["first_name", "last_name", "name"], name: "contacts_search_idx", using: :gin, order: {first_name: :gin_trgm_ops, last_name: :gin_trgm_ops, name: :gin_trgm_ops}

在这里找到了这个解决方案:http: //apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/add_index#1553-Adding-index-with-other-operator-classes-PostgreSQL-

于 2015-04-15T19:18:49.853 回答
2

您现在可以使用以下opclass选项:

add_index :contacts, [:first_name, :last_name, :name], name: "contacts_search_idx", using: :gin, opclass: { first_name: :gin_trgm_ops, last_name: :gin_trgm_ops, name: :gin_trgm_ops }
于 2018-06-15T11:20:57.483 回答
1

不幸的是,除非架构更改为 sql,否则无法解决此问题。几个链接:

Rails 和 Postgres Hstore:可以在迁移中添加索引吗?

为什么 add_index 使用 'gin' 来创建一个 'btree' 索引?

一旦我将模式格式更改为 sql,它就可以正常工作。

于 2015-04-17T12:18:34.640 回答
1

您需要安装btree_ginPostgres扩展才能使用 GIN 索引。

只需添加enable_extension('btree_gin')到迁移中,一切都应该可以正常工作。

于 2016-01-25T11:30:08.390 回答