2010-05-10 9 views
284

Abbiamo la sintassi script/generate migration add_fieldname_to_tablename fieldname:datatype per l'aggiunta di nuove colonne a un modello.Migrazione delle rotaie per la colonna di cambio

Sulla stessa riga, abbiamo uno script/generare per modificare il tipo di dati di una colonna? O dovrei scrivere SQL direttamente nella mia migrazione vanilla?

Desidero modificare una colonna da datetime a date.

risposta

478

Penso che questo dovrebbe funzionare.

change_column :table_name, :column_name, :date 
+0

speravo più di uno script/generate rotta migratoria. change_column funziona bene in una migrazione standalone – papdel

+13

@b_ayan: per quanto ne so, le uniche parole magiche nei nomi di migrazione sono "aggiungi" e "rimuovi". –

+0

Sort-of rails noob qui, ma ... Capisco la risposta ma non i commenti su questa risposta. Chiarimenti apprezzati :) –

93

È inoltre possibile utilizzare un blocco se si dispone di più colonne per cambiare all'interno di una tabella.

Esempio:

change_table :table_name do |t| 
    t.change :column_name, :column_type, {options} 
end 

Vedere la API documentation on the Table class per maggiori dettagli.

80

Non sono a conoscenza se è possibile creare una migrazione dalla riga di comando per eseguire tutto ciò, ma è possibile creare una nuova migrazione, quindi modificare la migrazione per eseguire questa operazione.

Se tablename è il nome della tabella, fieldname è il nome del campo e si desidera passare da un datetime ad un data, è possibile scrivere una migrazione per farlo.

È possibile creare una nuova migrazione con:

rails g migration change_data_type_for_fieldname 

Quindi modificare la migrazione da utilizzare change_table:

class ChangeDataTypeForFieldname < ActiveRecord::Migration 
    def self.up 
    change_table :tablename do |t| 
     t.change :fieldname, :date 
    end 
    end 
    def self.down 
    change_table :tablename do |t| 
     t.change :fieldname, :datetime 
    end 
    end 
end 

quindi eseguire la migrazione:

rake db:migrate 
23

Come ho scoperto da le risposte precedenti, sono necessari tre passaggi per modificare il tipo di una colonna:

Fase 1:

generare un nuovo file di migrazione utilizzando questo codice:

rails g migration sample_name_change_column_type 

Fase 2:

Vai alla cartella /db/migrate e modificare il file di migrazione che hai fatto. Ci sono due diverse soluzioni.

  1. def change 
        change_column(:table_name, :column_name, :new_type) 
    end 
    

2.

def up 
     change_column :table_name, :column_name, :new_type 
    end 

    def down 
     change_column :table_name, :column_name, :old_type 
    end 

Fase 3:

Non dimenticate di fare questo comando:

rake db:migrate 

Ho testato questa soluzioneper Rails 4 e funziona bene.

+1

Nel passaggio 2, il primo avrà esito negativo dopo l'esecuzione del rake db: rollback, ti ​​consiglio di controllare il secondo – Feuda

+0

Esiste una convenzione per le rotaie che consente a tutti di essere più o meno fatti durante la generazione del file di migrazione senza andare ad esso, e quindi di modificare vero? – BKSpurgeon

+0

@BKSpurgeon Sì, controlla la documentazione qui: http://edgeguides.rubyonrails.org/active_record_migrations.html –

0

Un altro modo per cambiare il tipo di dati utilizzando la migrazione

step1: È necessario rimuovere il tipo di dati nome del campo in errore usando migrazione

es:

rails g migration RemoveFieldNameFromTableName field_name:data_type 

Qui non dimenticare di specificare il tipo di dati per il tuo campo

Fase 2: ora è possibile aggiungere il campo con il corretto tipo di dati

es:

rails g migration AddFieldNameToTableName field_name:data_type 

Questo è tutto, ora la vostra tavola sarà aggiunto con il corretto campo di tipo di dati, Felice rubino codifica !!

1

solo creare migrazione:

rails g migration change_column_to_new_from_table_name 

migrazione Aggiornamento in questo modo:

class ClassName < ActiveRecord::Migration 
    change_table :table_name do |t| 
     t.change :column_name, :data_type 
    end 
end 

e infine

rake db:migrate 
Problemi correlati