2009-03-06 11 views

risposta

0

È 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.

+2

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.) –

3

Secondo lo API, l'utilizzo di remove_index e add_index è l'unico modo per ottenere ciò.

+5

Non più vero. Dovrebbe essere cancellato? – dgilperez

40

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

+1

rename_index sembra essere stato aggiunto in 2.3.8, il tuo secondo link mostra anche quella versione. – mmacaulay

+3

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. –

+4

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

52

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.

+0

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

8

A partire da Rails 5 (EDIT: anche in Rails 4), la rinomina della colonna ridenomina automaticamente anche l'indice.

+0

Questo è fantastico! Dovrebbe essere menzionato nella risposta accettata. –

+0

Sì. Questa domanda è stata posta nel 2009 !! 7 anni dopo, molto è cambiato. È automatico ora. – gregblass

Problemi correlati