43

在 Rails 中可以这样做:

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

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

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

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

4

2 回答 2

56

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

add_index :products, :data, using: :gin
于 2013-09-10T20:40:37.370 回答
34

哇!我有几根头发变白了。我正在使用 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 模块的列表

于 2015-12-04T00:07:17.857 回答