Alterar um tipo de coluna de Date para DateTime durante a migração do ROR

227

Preciso alterar meu tipo de coluna de data para data e hora para um aplicativo que estou criando. Eu não ligo para os dados, pois eles ainda estão sendo desenvolvidos.

Como posso fazer isso?

jdog
fonte

Respostas:

508

Primeiro no seu terminal:

rails g migration change_date_format_in_my_table

Em seguida, no seu arquivo de migração:

Para Rails> = 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
apneadiving
fonte
27
Você está certo, eu só assumiu um novato iria escolher a tecnologia mais recente disponível, mas isso é, obviamente, inseguro
apneadiving
12
A questão é marcado "ruby-on-rails-3"
Sucrenoir
2
@Sucrenoir Sim, a tag foi adicionada por apneadiving depois que ele respondeu.
26413 Jason
10
Se você está se perguntando por que um único changemétodo não é usado em vez dos métodos upe down, é porque o changemétodo não suporta a change_columndefinição de migração .
Dennis
2
Esta resposta está apenas parcialmente correta, você não pode usar change_column dentro de change, mesmo nos trilhos 4, ou a migração para baixo não funcionará. Você deve usar up / down, não importa a versão dos trilhos.
19373 Alan Peabody
78

Além disso, se você estiver usando o Rails 3 ou mais recente, não precisará usar os métodos upe down. Você pode apenas usar change:

class ChangeFormatInMyTable < ActiveRecord::Migration
  def change
    change_column :my_table, :my_column, :my_new_type
  end
end
Lee McAlilly
fonte
78
O método de alteração funciona apenas com migrações reversíveis. O código acima geraria uma exceção ActiveRecord :: IrreversibleMigration. Somente métodos em api.rubyonrails.org/classes/ActiveRecord/Migration/… devem ser usados ​​no método de alteração.
Davekaro
3
Estou executando o Rails 4 e fiz esse tipo de migração antes. MUDANÇA NÃO FUNCIONA! O comentário de @ davekaro está correto.
harryt
3
Para o Rails 5, esta é a solução correta e funcional.
WM
3
Ao ser revertido, como saberia qual é o tipo de coluna antigo para o qual deveria mudar?
Andrew Grimm
@AndrewGrimm você está correto. Isto é o que vejo quando tento reverter minha migração: #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 Mark
42

No Rails 3.2 e Rails 4, a resposta popular de Benjamin tem uma sintaxe um pouco diferente.

Primeiro no seu terminal:

$ rails g migration change_date_format_in_my_table

Em seguida, no seu arquivo de migração:

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
Thomas Klemm
fonte
23

Existe um método change_column , basta executá-lo na sua migração com datetime como um novo tipo.

change_column(:my_table, :my_column, :my_new_type)
Nikita Rybak
fonte
1
isso preserva os dados originais?
precisa saber é o seguinte
1
Sim, preserve os dados originais
Mauro
1

AFAIK, existem migrações para tentar remodelar os dados importantes (por exemplo, produção) ao fazer alterações no esquema. Portanto, a menos que isso esteja errado, e como ele disse que não se importa com os dados, por que não modificar o tipo de coluna na migração original de data para data e hora e executar novamente a migração? (Espero que você tenha testes :)).

fakeleft
fonte
2
Você poderia se preocupar em usar uma migração em um ambiente de desenvolvimento, mesmo que não se preocupe com os dados, se estiver trabalhando em uma equipe e desejar que sua alteração de esquema seja propagada para todos os outros desenvolvedores em sua equipe.
Jose B
Estou tendo problemas para ver qual a vantagem da migração adicional para alterar uma coluna nessa situação. O que há de errado em alterar a migração original que criou a coluna? Nos dois casos, cada membro da equipe precisa executar novamente todas as migrações para obter o novo esquema.
Fakeleft
Se você usar uma nova migração, poderá desfazer a migração que mudou o tipo de coluna. Se você fosse editar o original, teria que reverter essa edição e executar novamente as migrações depois disso.
jazzpi
Esta é realmente uma resposta muito prudente, considerando que ainda não há dados de produção. Para aqueles que se preocupam com outros membros da equipe, rake db:migrate:reseté para isso.
Ryan McGeary 06/02