4つの関連するテーブルの外部キーから作成される一意のインデックスを追加しようとしています。
add_index :studies,
["user_id", "university_id", "subject_name_id", "subject_type_id"],
:unique => true
データベースのインデックス名の制限により、移行が失敗します。エラーメッセージは次のとおりです。
テーブル 'studies'のインデックス名 'index_studies_on_user_id_and_university_id_and_subject_name_id_and_subject_type_id'は長すぎます。制限は64文字です
どうすればこれを処理できますか?別のインデックス名を指定できますか?
:name
オプションを add_index
に指定します。例:
add_index :studies,
["user_id", "university_id", "subject_name_id", "subject_type_id"],
:unique => true,
:name => 'my_index'
:index
ブロックの references
でcreate_table
オプションを使用する場合、その値としてadd_index
と同じオプションハッシュを使用します。
t.references :long_name, index: { name: :my_index }
create_table
ブロック内の列定義のインデックス名を変更することもできます(移行ジェネレーターから取得するなど)。
create_table :studies do |t|
t.references :user, index: {:name => "index_my_shorter_name"}
end
PostgreSQLでは、 default制限は63文字 です。インデックス名は一意でなければならないので、少し慣習があるのはいいことです。私は使用します(より複雑な構成を説明するために例を調整しました)。
def change
add_index :studies, [:professor_id, :user_id], name: :idx_study_professor_user
end
通常のインデックスは次のとおりです。
:index_studies_on_professor_id_and_user_id
ロジックは次のとおりです。
index
はidx
になります_id
これは通常、仕事をします。
あなたもできる
t.index([:branch_id, :party_id], unique: true, name: 'by_branch_party')
Ruby on Rails API のように。
前の回答と同様:通常のadd_index行で 'name'キーを使用するだけです:
def change
add_index :studies, :user_id, name: 'my_index'
end