Isso tudo pressupõe que o tipo de dados da coluna tenha uma conversão implícita para quaisquer dados existentes. Eu já tive várias situações em que os dados existentes, digamos, String
podem ser implicitamente convertidos no novo tipo de dados, digamos Date
.
Nessa situação, é útil saber que você pode criar migrações com conversões de dados. Pessoalmente, gosto de colocá-las no meu arquivo de modelo e removê-las depois que todos os esquemas do banco de dados foram migrados e estão estáveis.
/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