web-dev-qa-db-ja.com

Rails 4 pgsql add_indexタイプGINまたはGiST

Railsでは、次のことが可能です:

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

Rails 4でPGSQLを使用してGINまたはGistインデックスを追加することは可能ですか?

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

または、手動の実行文を使用していますか?この背後にある概念は、structure.sqlを使用する代わりにschema.rbを保持したいということです。

34
Bill

Rails 4では、移行で次のようなことができます:

add_index :products, :data, using: :gin
44
Pronix

うわー!私はこれにいくつかの髪を白くしました。 Rails 4.2を使用してこの移行を実行しようとすると、上記の人と同じエラーが発生しました。

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

実際にschema.rbを引き続き使用でき、config/application.rbを使用する必要がないことがわかりました

config.active_record.schema_format = :sql

私が欠けていた主なものの1つは、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モジュールのリストです

26
Josh