Come gestisco nomi di indici troppo lunghi in una migrazione di Ruby on Rails ActiveRecord?

Sto cercando di aggiungere un indice univoco che viene creato dalle chiavi esterne di quattro tabelle associate:

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

La limitazione del database per il nome dell’indice causa il fallimento della migrazione. Ecco il messaggio di errore:

Il nome dell’indice ‘index_studies_on_user_id_and_university_id_and_subject_name_id_and_subject_type_id’ sulla tabella ‘studi’ è troppo lungo; il limite è 64 caratteri

Come posso gestire questo? Posso specificare un nome di indice diverso?

Fornire l’opzione :name a add_index , ad esempio:

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

Se si utilizza l’opzione :index sui references in un blocco create_table assume lo stesso hash delle opzioni come add_index come valore.

È anche ansible modificare il nome dell’indice nelle definizioni di colonna all’interno di un blocco create_table (come si ottiene dal generatore di migrazione).

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

In PostgreSQL, il limite predefinito è 63 caratteri . Poiché i nomi degli indici devono essere unici, è bello avere una piccola convenzione. Io uso (ho ottimizzato l’esempio per spiegare le costruzioni più complesse):

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

L’indice normale sarebbe stato:

 :index_studies_on_professor_id_and_user_id 

La logica sarebbe:

  • index diventa idx
  • Nome del tavolo singolare
  • Nessuna parola unita
  • No _id
  • Ordine alfabetico

Che di solito fa il lavoro.

Puoi anche fare

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

come nell’API Ruby on Rails .

Simile alla risposta precedente: basta usare il tasto ‘nome’ con la tua regolare riga add_index:

 def change add_index :studies, :user_id, name: 'my_index' end