Đây là tất cả giả định rằng kiểu dữ liệu của cột có một chuyển đổi ngầm định cho bất kỳ dữ liệu hiện có. Tôi đã gặp phải một số tình huống trong đó dữ liệu hiện có, giả sử String
có thể được chuyển đổi hoàn toàn thành kiểu dữ liệu mới, giả sử Date
.
Trong tình huống này, thật hữu ích khi biết bạn có thể tạo chuyển đổi với chuyển đổi dữ liệu. Cá nhân, tôi thích đặt chúng trong tệp mô hình của mình và sau đó xóa chúng sau khi tất cả các lược đồ cơ sở dữ liệu đã được di chuyển và ổn định.
/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