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?
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 }
_
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
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
_id
Ce qui fait habituellement le travail.
Vous pouvez aussi faire
t.index([:branch_id, :party_id], unique: true, name: 'by_branch_party')
comme dans le Ruby on Rails API .
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