Todo esto supone que el tipo de datos de la columna tiene una conversión implícita para cualquier dato existente. Me he encontrado con varias situaciones en las que los datos existentes, digamos que a, String
se pueden convertir implícitamente en el nuevo tipo de datos, digamos Date
.
En esta situación, es útil saber que puede crear migraciones con conversiones de datos. Personalmente, me gusta ponerlos en mi archivo modelo y luego eliminarlos después de que todos los esquemas de la base de datos se hayan migrado y sean estables.
/app/models/table.rb
...
def string_to_date
update(new_date_field: date_field.to_date)
end
def date_to_string
update(old_date_field: date_field.to_s)
end
...
def up
# Add column to store converted data
add_column :table_name, :new_date_field, :date
# Update the all resources
Table.all.each(&:string_to_date)
# Remove old column
remove_column :table_name, :date_field
# Rename new column
rename_column :table_name, :new_date_field, :date_field
end
# Reversed steps does allow for migration rollback
def down
add_column :table_name, :old_date_field, :string
Table.all.each(&:date_to_string)
remove_column :table_name, :date_field
rename_column :table_name, :old_date_field, :date_field
end