web-dev-qa-db-fra.com

Comment gérer des noms d'index trop longs dans une migration ActiveRecord Ruby sur Rails]?

J'essaie d'ajouter un index unique créé à partir des clés étrangères de quatre tables associées:

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

La limitation de la base de données pour le nom d’index entraîne l’échec de la migration. Voici le message d'erreur:

Le nom d'index 'index_studies_on_user_id_and_university and id_university_name_subject_id_and_subject_type_id' sur la table 'studies' est trop long; la limite est de 64 caractères

Comment puis-je gérer cela? Puis-je spécifier un nom d'index différent?

356
JJD

Fournissez l'option _:name_ à add_index , par exemple:

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

Si vous utilisez l'option _:index_ sur references dans un bloc _create_table_, le même hachage des options que _add_index_ a pour valeur:

_t.references :long_name, index: { name: :my_index }
_
537
fl00r

Vous pouvez également modifier le nom de l'index dans les définitions de colonne d'un bloc create_table (par exemple, à l'aide du générateur de migration).

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

Dans PostgreSQL, la limite par défaut est de 63 caractères . Parce que les noms d'index doivent être uniques, c'est bien d'avoir une petite convention. J'utilise (j'ai modifié l'exemple pour expliquer des constructions plus complexes):

def change
  add_index :studies, [:professor_id, :user_id], name: :idx_study_professor_user
end

L'indice normal aurait été:

:index_studies_on_professor_id_and_user_id

La logique serait:

  • index devient idx
  • Nom de table singulier
  • Pas de mots joints
  • Non _id
  • Ordre alphabétique

Ce qui fait habituellement le travail.

33
ecoologic

Vous pouvez aussi faire

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

comme dans le Ruby on Rails API .

20
tomascharad

Semblable à la réponse précédente: utilisez simplement la clé 'name' avec votre ligne add_index habituelle:

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