it-swarm.com.de

Wie gehe ich bei einer Ruby on Rails ActiveRecord-Migration mit zu langen Indexnamen um?

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 Beschrä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 'studies' ist zu lang. Die maximale Länge beträgt 64 Zeichen

Wie kann ich damit umgehen? Kann ich einen anderen Indexnamen angeben?

356
JJD

Zur Verfügung stellen :name Option auf add_index , z.

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

Bei Verwendung des :index Option auf references in einem create_table Block, es dauert die gleichen Optionen Hash als add_index als Wert:

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

Sie können den Indexnamen auch in Spaltendefinitionen innerhalb eines Blocks create_table Ändern (wie Sie es vom Migrationsgenerator erhalten).

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

In PostgreSQL ist das Standardlimit 63 Zeichen . Da Indexnamen eindeutig sein müssen, ist es schön, ein wenig Konvention zu haben. Ich benutze (ich habe das Beispiel optimiert, um komplexere Konstruktionen zu erklären):

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

Der normale Index wäre gewesen:

:index_studies_on_professor_id_and_user_id

Die Logik wäre:

  • index wird idx
  • Singularer Tabellenname
  • Keine verbindenden Wörter
  • Nein _id
  • Alphabetischer Reihenfolge

Welches erledigt normalerweise die Arbeit.

33
ecoologic

Sie können auch tun

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

wie in der Ruby on Rails API .

20
tomascharad

Ähnlich wie bei der vorherigen Antwort: Verwenden Sie einfach den 'name'-Schlüssel mit Ihrer regulären add_index-Zeile:

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