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
_id
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