นี่คือสมมุติว่าประเภทข้อมูลของคอลัมน์มีการแปลงโดยนัยสำหรับข้อมูลใด ๆ ที่มีอยู่ ฉันพบกับสถานการณ์หลายอย่างที่ข้อมูลที่มีอยู่สมมติว่า a String
สามารถแปลงเป็นประเภทข้อมูลใหม่โดยนัยDate
ได้
ในสถานการณ์นี้การรู้ว่าคุณสามารถสร้างการย้ายข้อมูลด้วยการแปลงข้อมูลเป็นประโยชน์ โดยส่วนตัวแล้วฉันชอบวางสิ่งเหล่านี้ลงในไฟล์โมเดลแล้วลบออกหลังจากสกีมาฐานข้อมูลทั้งหมดได้รับการโยกย้ายและมีเสถียรภาพ
/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