web-dev-qa-db-ja.com

Ruby ActiveRecord移行のRailsで長すぎるインデックス名を処理するにはどうすればよいですか?

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文字です

どうすればこれを処理できますか?別のインデックス名を指定できますか?

344
JJD

:nameオプションを add_index に指定します。例:

add_index :studies,
  ["user_id", "university_id", "subject_name_id", "subject_type_id"], 
  :unique => true,
  :name => 'my_index'

:indexブロックの referencescreate_tableオプションを使用する場合、その値としてadd_indexと同じオプションハッシュを使用します。

t.references :long_name, index: { name: :my_index }
514
fl00r

create_tableブロック内の列定義のインデックス名を変更することもできます(移行ジェネレーターから取得するなど)。

create_table :studies do |t|
  t.references :user, index: {:name => "index_my_shorter_name"}
end
156
Craig Walker

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

ロジックは次のとおりです。

  • indexidxになります
  • 特異なテーブル名
  • 参加する言葉はありません
  • いいえ_id
  • アルファベット順

これは通常、仕事をします。

32
ecoologic

あなたもできる

t.index([:branch_id, :party_id], unique: true, name: 'by_branch_party')

Ruby on Rails AP​​I のように。

19
tomascharad

前の回答と同様:通常のadd_index行で 'name'キーを使用するだけです:

def change
  add_index :studies, :user_id, name: 'my_index'
end
5
Nadeem Yasin