So che c'è una trasformazione rename_column
, ma sembra che rename_index
non esiste.È possibile rinominare un indice utilizzando una migrazione delle rotaie?
Devo utilizzare remove_index
e add_index
?
So che c'è una trasformazione rename_column
, ma sembra che rename_index
non esiste.È possibile rinominare un indice utilizzando una migrazione delle rotaie?
Devo utilizzare remove_index
e add_index
?
È anche possibile eseguire SQL arbitrario nelle migrazioni.
Abbiamo alcune metodi di supporto che aggiungono chiavi esterne sulle nostre tavole:
def add_foreign_key(from_table, from_column, to_table)
constraint_name = "fk_#{from_table}_#{from_column}"
execute %{alter table #{from_table}
add constraint #{constraint_name}
foreign key (#{from_column})
references #{to_table}(id)
}
end
È possibile utilizzare qualsiasi SQL il database supporta.
Rails 3 forniscono una scorciatoia per rinominare un indice:
rename_index :table_name, :old_name, :new_name
http://guides.rubyonrails.org/migrations.html
Tra l'altro, non fa altro che rimuovere il vecchio e l'aggiunta di quello nuovo:
http://apidock.com/rails/v2.3.8/ActiveRecord/ConnectionAdapters/SchemaStatements/rename_index
rename_index sembra essere stato aggiunto in 2.3.8, il tuo secondo link mostra anche quella versione. – mmacaulay
rename_index sembra non fare nulla in Rails 3.1.3. La migrazione sembra funzionare in modo pulito, ma controllando sia lo schema.rb che eseguendo 'SHOW INDEXES FROM table_name' in MySQL mostra l'indice mantenendo il suo nome precedente. –
Come indicato nella risposta di nothus sotto i nomi degli indici devono essere dati come stringhe o la chiamata a rename_index fallisce in modo silenzioso – Willbill
rename_index
devono essere forniti stringhe e non simboli.
rename_index :table_name, 'old_name', 'new_name'
mi aveva graffiare la mia testa per un po 'quando si cerca di rinominare una tabella ed è indici. Rails 3.2.3 e MySQL.
PS: Ricordare di "rename_index' ** prima ** you' rinominare_colonna', altrimenti, SQLServer genererà un'eccezione : 'O il parametro @objname è ambiguo o il @objtype (INDICE) richiesto è sbagliato. – Magne
A partire da Rails 5 (EDIT: anche in Rails 4), la rinomina della colonna ridenomina automaticamente anche l'indice.
Questo è fantastico! Dovrebbe essere menzionato nella risposta accettata. –
Sì. Questa domanda è stata posta nel 2009 !! 7 anni dopo, molto è cambiato. È automatico ora. – gregblass
Una situazione in cui potresti dover usare 'execute' è se Rails ha aggiunto un indice e lo ha chiamato in base al nome della tabella, quindi hai rinominato la tabella. Ad esempio, ho creato 'users_roles' e ho fatto una migrazione per aggiungere un indice, che Rails ha chiamato' index_users_roles_on_role_id'. Poi ho capito che avevo bisogno di rinominare la tabella in 'roles_users'. Più tardi, quando ho provato a rimuovere l'indice, Rails cercava uno chiamato "index_roles_users_on_role_id'. Quindi ho dovuto usare 'execute 'DROP INDEX index_users_roles_on_role_id ON roles_users" 'nella mia migrazione. (Questo è per MySQL.) –