Wie gehe ich mit zu lange-index-Namen in eine Ruby on Rails-ActiveRecord-migration?
Ich versuche, fügen Sie einen eindeutigen index, der angelegt wird, aus der der Fremdschlüssel der vier zugehörigen Tabellen:
add_index :studies,
["user_id", "university_id", "subject_name_id", "subject_type_id"],
:unique => true
Der Datenbank-Einschränkung für den index-name führt zu einem scheitern der migration. Hier ist die Fehlermeldung:
Index name 'index_studies_on_user_id_and_university_id_and_subject_name_id_and_subject_type_id' auf Tabelle 'Studien' ist zu lang; die Grenze ist 64 Zeichen
Wie kann ich das umgehen? Kann ich angeben, einen anderen index name?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bieten die
:name
optionadd_index
, z.B.:Wenn Sie mit der
:index
option aufReferenzen
in einemcreate_table
block, es nimmt die gleichen Optionen hash alsadd_index
als Wert:name: 'my_index'
in ruby 4remove_index :studies, :name => 'my_index'
für jeden, der Sie brauchtKönnen Sie auch den index ändern name in Spalte Definitionen innerhalb eines
create_table
block (wie Sie von der migration-generator).create_table
t.references :searchable, polymorphic:true, index: {:name => "index_searches_on_searchable"}
in diesem Fall der index war in der Tat ein multi-Spalte(searchable_id und searchable_type) und die Zugabe des namespace der generierten Namen wurde sehr lang.foreign_key: true
und übrigens, dies ist eine großartige Lösung, da es am einfachsten zu verwenden, wenn Sie eine migration-Datei erstellt, mit der rails-generatormodel:references
formatIn PostgreSQL, die Standard Grenzwert ist 63 Zeichen. Weil index-Namen müssen eindeutig sein, es ist schön zu haben, ein wenig Konvention. Ich benutze (ich habe gezwickt Beispiel zu erklären komplexere Konstruktionen):
Den normalen index gewesen wäre:
Die Logik wäre:
index
wirdidx
_id
Die in der Regel nicht den job zu.
Können Sie auch tun,
als in der Ruby on Rails-API.
Ähnlich zu der vorherigen Antwort: verwenden Sie Einfach das "name" - Schlüssel mit Ihrem regelmäßigen add_index Linie: