479 Stimmen

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

Ich versuche, einen eindeutigen Index hinzuzufügen, der aus den Fremdschlüsseln von vier zugehörigen Tabellen erstellt wird:

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

Die Beschränkung des Datenbanknamens 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; das Limit beträgt 64 Zeichen

Wie kann ich das handhaben? Kann ich einen anderen Indexnamen angeben?

745voto

fl00r Punkte 81243

Bieten Sie die :name-Option für add_index an, z. B.:

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

Wenn Sie die :index-Option auf references in einem create_table-Block verwenden, nimmt sie den gleichen Options-Hash wie add_index als ihren Wert:

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

215voto

Craig Walker Punkte 46757

Sie können den Indexnamen in den Spaltendefinitionen innerhalb eines create_table-Blocks ändern (wie Sie ihn vom Migrationsgenerator erhalten).

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

48voto

ecoologic Punkte 9740

In PostgreSQL ist das Standardlimit 63 Zeichen. Weil Indexnamen eindeutig sein müssen, ist es gut, eine kleine Konvention zu haben. Ich verwende (ich habe das Beispiel angepasst, um komplexere Konstruktionen zu erklären):

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

Der normale Index hätte sein sollen:

:index_studies_on_professor_id_and_user_id

Die Logik wäre:

  • index wird zu idx
  • Singularer Tabellenname
  • Keine Verknüpfungswörter
  • Kein _id
  • Alphabetische Reihenfolge

Was normalerweise funktioniert.

25voto

tomascharad Punkte 3066

Sie können auch

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

wie im Ruby on Rails API tun.

8voto

Nadeem Yasin Punkte 4403

Ähnlich wie die vorherige 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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X