Railsでは、次のことが可能です:
add_index :table, :column_name, :using => 'btree'
Rails 4でPGSQLを使用してGIN
またはGist
インデックスを追加することは可能ですか?
add_index :students, :name, :using => 'gin'
または、手動の実行文を使用していますか?この背後にある概念は、structure.sqlを使用する代わりにschema.rbを保持したいということです。
Rails 4では、移行で次のようなことができます:
add_index :products, :data, using: :gin
うわー!私はこれにいくつかの髪を白くしました。 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