Ich versuche, einen eindeutigen Index hinzuzufügen, der aus den Fremdschlüsseln von vier zugeordneten Tabellen erstellt wird:
add_index :studies,
["user_id", "university_id", "subject_name_id", "subject_type_id"],
:unique => true
Die Einschränkung der Datenbank für den Indexnamen führt dazu, dass die Migration fehlschlägt. Hier ist die Fehlermeldung:
Der Indexname 'index_studies_on_user_id_and_university_id_and_subject_name_id_and_subject_type_id' in der Tabelle 'study' ist zu lang. Das Limit beträgt 64 Zeichen
Wie kann ich damit umgehen? Kann ich einen anderen Indexnamen angeben?
remove_index :studies, :name => 'my_index'
für jeden, der sie braucht4.2.6
funktioniert mitindex: { name: :my_index }
. Nurname
hat nicht funktioniert.Sie können den Indexnamen auch in Spaltendefinitionen innerhalb eines
create_table
Blocks ändern (z. B. vom Migrationsgenerator).quelle
create_table
t.references :searchable, polymorphic:true, index: {:name => "index_searches_on_searchable"}
In diesem Fall war der Index tatsächlich mehrspaltig (searchable_id und searchable_type), und das Hinzufügen des Namespace zum generierten Namen wurde sehr lang .foreign_key: true
und übrigens, dies ist eine großartige Lösung, da es am einfachsten zu verwenden ist, wenn Sie eine Migrationsdatei mit dem Rails-Generator-model:references
Format erstellt habenIn PostgreSQL beträgt das Standardlimit 63 Zeichen . Da Indexnamen eindeutig sein müssen, ist es schön, eine kleine Konvention zu haben. Ich benutze (ich habe das Beispiel optimiert, um komplexere Konstruktionen zu erklären):
Der normale Index wäre gewesen:
Die Logik wäre:
index
wirdidx
_id
Welches macht normalerweise den Job.
quelle
Sie können auch tun
wie in der Ruby on Rails-API .
quelle
Ähnlich wie bei der vorherigen Antwort: Verwenden Sie einfach den Schlüssel 'name' mit Ihrer regulären Zeile add_index:
quelle
Ich fürchte, keine dieser Lösungen hat bei mir funktioniert. Vielleicht, weil ich
belongs_to
in meiner create_table-Migration eine polymorphe Assoziation verwendet habe.Ich füge unten meinen Code und einen Link zu der Lösung hinzu, die mir geholfen hat, falls jemand bei der Suche nach "Indexname ist zu lang" im Zusammenhang mit polymorphen Assoziationen stolpert.
Der folgende Code hat bei mir NICHT funktioniert:
Dieser Code hat bei mir funktioniert:
Dies ist die SO Q & A, die mir geholfen hat: https://stackoverflow.com/a/30366460/3258059
quelle
Ich hatte dieses Problem, aber mit der
timestamps
Funktion. Es wurde automatisch ein Index für update_at generiert, der die 63-Zeichen-Grenze überschritten hat:Ich habe versucht, den Indexnamen
timestamps
anzugeben:Allerdings versucht dies die Indexnamen für beide die anzuwenden
updated_at
undcreated_at
Felder:Schließlich habe ich aufgegeben
timestamps
und nur die Zeitstempel auf dem langen Weg erstellt:Das funktioniert, aber ich würde gerne hören, ob es mit der
timestamps
Methode möglich ist!quelle
create_table: you_table_name do | t | t.references: studant, index: {name: 'name_for_studant_index'} t.references: Lehrer, index: {name: 'name_for_teacher_index'} end
quelle
Ich habe ein Projekt, das häufig Generatoren verwendet, und dies musste automatisch erfolgen. Deshalb habe ich die
index_name
Funktion aus der Rails-Quelle kopiert , um sie zu überschreiben. Ich habe dies hinzugefügt inconfig/initializers/generated_index_name.rb
:Es erstellt Indizes wie
ix_assignments_on_case_id__project_id
und schneidet sie nur auf 63 Zeichen ab, wenn sie noch zu lang sind. Das ist immer noch nicht eindeutig, wenn der Tabellenname sehr lang ist. Sie können jedoch Komplikationen hinzufügen, z. B. den Tabellennamen getrennt von den Spaltennamen kürzen oder tatsächlich auf Eindeutigkeit prüfen.Beachten Sie, dass dies aus einem Rails 5.2-Projekt stammt. Wenn Sie sich dazu entschließen, kopieren Sie die Quelle aus Ihrer Version.
quelle