J'essaie d'ajouter un index unique qui est 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_id_and_subject_name_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?
remove_index :studies, :name => 'my_index'
pour tous ceux qui en ont besoin4.2.6
fonctionne avecindex: { name: :my_index }
. Seulementname
n'a pas fonctionné.Vous pouvez également modifier le nom de l'index dans les définitions de colonne d'un
create_table
bloc (tel que celui obtenu à partir du générateur de migration).la source
create_table
t.references :searchable, polymorphic:true, index: {:name => "index_searches_on_searchable"}
dans ce cas, l'index était en fait une multi-colonne (searchable_id et searchable_type) et l'ajout de l'espace de noms dans le nom généré est devenu très long .foreign_key: true
et d'ailleurs, c'est une excellente solution car il est le plus facile à utiliser lorsque vous avez un fichier de migration créé avec lemodel:references
format de générateur de railsDans 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 peaufiné l'exemple pour expliquer des constructions plus complexes):
L'indice normal aurait été:
La logique serait:
index
devientidx
_id
Qui fait généralement le travail.
la source
Vous pouvez aussi faire
comme dans l' API Ruby on Rails .
la source
Semblable à la réponse précédente: Utilisez simplement la touche 'nom' avec votre ligne add_index régulière:
la source
Je crains qu'aucune de ces solutions ne fonctionne pour moi. Peut-être parce que j'utilisais
belongs_to
dans ma migration create_table pour une association polymorphe.J'ajouterai mon code ci-dessous et un lien vers la solution qui m'a aidé au cas où quelqu'un d'autre tomberait dessus lors de la recherche de 'Le nom d'index est trop long' en rapport avec les associations polymorphes.
Le code suivant n'a PAS fonctionné pour moi:
Ce code a fonctionné pour moi:
C'est le Q&A SO qui m'a aidé: https://stackoverflow.com/a/30366460/3258059
la source
J'ai eu ce problème, mais avec la
timestamps
fonction. Il générait automatiquement un index sur updated_at qui dépassait la limite de 63 caractères:J'ai essayé d'utiliser
timestamps
pour spécifier le nom d'index:Cependant, cela essaie d'appliquer le nom d'index aux champs
updated_at
etcreated_at
:Enfin, j'ai abandonné et j'ai
timestamps
juste créé les horodatages à long terme:Cela fonctionne mais j'aimerais savoir si c'est possible avec la
timestamps
méthode!la source
create_table: you_table_name do | t | t.references: studant, index: {name: 'name_for_studant_index'} t.references: teacher, index: {name: 'name_for_teacher_index'} end
la source
J'ai un projet qui utilise beaucoup de générateurs et dont j'avais besoin pour être automatique, j'ai donc copié la
index_name
fonction depuis la source des rails pour la remplacer. J'ai ajouté ceci dansconfig/initializers/generated_index_name.rb
:Il crée des index comme
ix_assignments_on_case_id__project_id
et le tronque simplement à 63 caractères s'il est encore trop long. Cela ne sera toujours pas unique si le nom de la table est très long, mais vous pouvez ajouter des complications telles que le raccourcissement du nom de la table séparément des noms de colonne ou la vérification de l'unicité.Remarque, cela provient d'un projet Rails 5.2; si vous décidez de le faire, copiez la source depuis votre version.
la source