Ini semua dengan asumsi bahwa tipe data kolom memiliki konversi implisit untuk setiap data yang ada. Saya telah mengalami beberapa situasi di mana data yang ada, katakanlah a String
dapat secara implisit dikonversi menjadi tipe data baru, katakanlah Date
.
Dalam situasi ini, perlu diketahui bahwa Anda dapat membuat migrasi dengan konversi data. Secara pribadi, saya suka meletakkan ini di file model saya, dan kemudian menghapusnya setelah semua skema database telah dimigrasi dan stabil.
/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