Modificare un tipo di colonna da Date a DateTime durante la migrazione ROR


227

Devo cambiare il tipo di colonna da data a datetime per un'app che sto realizzando. Non mi interessano i dati poiché sono ancora in fase di sviluppo.

Come posso fare questo?

Risposte:


508

Primo nel tuo terminale:

rails g migration change_date_format_in_my_table

Quindi nel tuo file di migrazione:

Per binari> = 3.2:

class ChangeDateFormatInMyTable < ActiveRecord::Migration
  def up
    change_column :my_table, :my_column, :datetime
  end

  def down
    change_column :my_table, :my_column, :date
  end
end

27
Hai ragione, ho appena pensato che un principiante avrebbe scelto la tecnologia più recente disponibile, ma questo, ovviamente, non è sicuro
ricordando il

12
La domanda è taggata "ruby-on-rails-3"
Sucrenoir

2
@Sucrenoir Sì, il tag è stato aggiunto da apneadiving dopo aver risposto.
Jason,

10
Se ti stai chiedendo perché un singolo changemetodo non viene utilizzato al posto dei metodi upe down, è perché il changemetodo non supporta la change_columndefinizione di migrazione .
Dennis,

2
Questa risposta è solo parzialmente corretta, non è possibile utilizzare change_column all'interno di change anche su rotaie 4 o la migrazione verso il basso non funzionerà. È necessario utilizzare su / giù, indipendentemente dalla versione dei binari.
Alan Peabody,

78

Inoltre, se stai utilizzando Rails 3 o versioni successive non devi utilizzare i metodi upe down. Puoi semplicemente usare change:

class ChangeFormatInMyTable < ActiveRecord::Migration
  def change
    change_column :my_table, :my_column, :my_new_type
  end
end

78
Il metodo di modifica funziona solo con migrazioni reversibili. Il codice sopra genererebbe un'eccezione ActiveRecord :: IrreversibleMigration. Solo i metodi in api.rubyonrails.org/classes/ActiveRecord/Migration/… devono essere usati nel metodo change.
Davekaro,

3
Sto eseguendo Rails 4 e ho fatto questo tipo di migrazione prima. IL CAMBIAMENTO NON FUNZIONA! Il commento di @ davekaro è corretto.
harryt,

3
Per Rails 5, questa è la soluzione corretta e funzionante.
WM,

3
Quando viene invertito, come farebbe a sapere in quale tipo di colonna precedente dovrebbe cambiare di nuovo?
Andrew Grimm,

@AndrewGrimm hai ragione. Questo è quello che vedo quando provo a invertire la mia migrazione:This migration uses change_column, which is not automatically reversible. To make the migration reversible you can either: 1. Define #up and #down methods in place of the #change method. 2. Use the #reversible method to define reversible behavior.
Marklar

42

In Rails 3.2 e Rails 4, la risposta popolare di Benjamin ha una sintassi leggermente diversa.

Primo nel tuo terminale:

$ rails g migration change_date_format_in_my_table

Quindi nel tuo file di migrazione:

class ChangeDateFormatInMyTable < ActiveRecord::Migration
  def up
   change_column :my_table, :my_column, :datetime
  end

  def down
   change_column :my_table, :my_column, :date
  end
end

23

C'è un metodo change_column , basta eseguirlo nella migrazione con datetime come nuovo tipo.

change_column(:my_table, :my_column, :my_new_type)

1
questo conserva i dati originali?
BKSpurgeon,

1
Sì, conserva i dati originali
Mauro,

1

AFAIK, le migrazioni sono lì per cercare di rimodellare i dati che ti interessano (ovvero la produzione) quando si apportano modifiche allo schema. Quindi, a meno che non sia sbagliato, e dal momento che ha detto che non gli importa dei dati, perché non modificare semplicemente il tipo di colonna nella migrazione originale da data a data e ora ed eseguire nuovamente la migrazione? (Spero che tu abbia i test :)).


2
Potresti potenzialmente preoccuparti di utilizzare una migrazione in un ambiente di sviluppo, anche se non ti interessano i dati, se lavori in un team e desideri che le modifiche allo schema vengano propagate a tutti gli altri sviluppatori del tuo team.
Jose B,

Ho difficoltà a vedere quale vantaggio offre la migrazione aggiuntiva per modificare una colonna in questa situazione. Cosa c'è di sbagliato nel cambiare la migrazione originale che ha creato la colonna? In entrambi i casi, ogni membro del team deve rieseguire tutte le migrazioni per ottenere il nuovo schema.
fakeleft,

Se si utilizza una nuova migrazione, è possibile annullare la migrazione che ha modificato il tipo di colonna. Se dovessi modificare l'originale, dovrai ripristinare tale modifica ed eseguire nuovamente le migrazioni.
jazzpi,

Questa è in realtà una risposta molto prudente considerando che non ci sono ancora dati di produzione. Per coloro che si preoccupano degli altri membri del team, questo è ciò che rake db:migrate:resetserve.
Ryan McGeary,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.