Tüm bunlar, sütunun veri türünün mevcut veriler için örtük bir dönüşüme sahip olduğunu varsayar. Var olan verilerin, diyelim ki, a Stringdolaylı olarak yeni veri tipine dönüştürülebileceği çeşitli durumlarla karşılaştım Date.
Bu durumda, veri dönüşümleriyle taşıma oluşturabileceğinizi bilmek faydalıdır. Şahsen, bunları model dosyama koymayı ve sonra tüm veritabanı şemaları taşındıktan ve kararlı olduktan sonra bunları kaldırmayı seviyorum.
/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