Cambiar un tipo de columna de Date a DateTime durante la migración de ROR

Respuestas:

508

Primero en tu terminal:

rails g migration change_date_format_in_my_table

Luego, en su archivo de migración:

Para rieles> = 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
fuente
27
Tienes razón, simplemente asumí que un principiante elegiría la última tecnología disponible, pero eso es, por supuesto, inseguro
cumplir el
12
La pregunta está etiquetada "ruby-on-rails-3"
Sucrenoir
2
@Sucrenoir Sí, la etiqueta fue agregada por apneadiving después de que él respondió.
Jason
10
Si se pregunta por qué changeno se usa un solo método en lugar de los métodos upy down, es porque el changemétodo no admite la change_columndefinición de migración .
Dennis
2
Esta respuesta es solo parcialmente correcta, no puede usar change_column dentro de change incluso en rails 4 o la migración hacia abajo no funcionará. Debe usar arriba / abajo sin importar la versión de los rieles.
Alan Peabody
78

Además, si está utilizando Rails 3 o más reciente, no tiene que usar los métodos upy down. Solo puedes usar change:

class ChangeFormatInMyTable < ActiveRecord::Migration
  def change
    change_column :my_table, :my_column, :my_new_type
  end
end
Lee McAlilly
fuente
78
El método de cambio solo funciona con migraciones reversibles. El código anterior arrojaría una excepción ActiveRecord :: IrreversibleMigration. Solo los métodos en api.rubyonrails.org/classes/ActiveRecord/Migration/… deben usarse en el método de cambio.
davekaro
3
Estoy ejecutando Rails 4 e hice este tipo de migración antes. ¡EL CAMBIO NO FUNCIONA! El comentario de @ davekaro es correcto.
harryt
3
Para Rails 5, esta es la solución correcta y funcional.
WM
3
Cuando se invierte, ¿cómo sabría cuál es el tipo de columna anterior al que debería volver a cambiar?
Andrew Grimm
@ AndrewGrimm tienes razón. Esto es lo que veo cuando trato de revertir mi migración: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

En Rails 3.2 y Rails 4, la respuesta popular de Benjamin tiene una sintaxis ligeramente diferente.

Primero en tu terminal:

$ rails g migration change_date_format_in_my_table

Luego, en su archivo de migración:

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
fuente
23

Hay un método change_column , simplemente ejecútelo en su migración con datetime como un nuevo tipo.

change_column(:my_table, :my_column, :my_new_type)
Nikita Rybak
fuente
1
¿preserva esto los datos originales?
BKSpurgeon
1
Sí, preservar los datos originales
Mauro
1

AFAIK, las migraciones están ahí para tratar de remodelar los datos que le interesan (es decir, la producción) al realizar cambios de esquema. Entonces, a menos que eso esté mal, y dado que dijo que no le importan los datos, ¿por qué no simplemente modificar el tipo de columna en la migración original de fecha a fecha y volver a ejecutar la migración? (Espero que tengas pruebas :)).

falso
fuente
2
Potencialmente, podría importarle usar una migración en un entorno de desarrollo, incluso si no le importan los datos, si está trabajando en un equipo y desea que su cambio de esquema se propague a todos los demás desarrolladores de su equipo.
Jose B
Tengo problemas para ver qué ventaja tiene la migración adicional para cambiar una columna en esta situación. ¿Qué tiene de malo cambiar la migración original que creó la columna? En cualquier caso, cada miembro del equipo debe volver a ejecutar todas las migraciones para obtener el nuevo esquema.
fakeleft
Si usa una nueva migración, puede deshacer la migración que cambió el tipo de columna. Si tuviera que editar el original, tendría que revertir esa edición y volver a ejecutar las migraciones después de eso.
jazzpi
Esta es en realidad una respuesta muy prudente teniendo en cuenta que todavía no hay datos de producción. Para aquellos que se preocupan por otros miembros del equipo, para eso rake db:migrate:resetestán.
Ryan McGeary