有时需要数据迁移.随着时间的推移,使用域模型的代码更改和迁移不再有效,迁移失败.迁移数据的最佳做法是什么?
我试着举个例子来澄清问题:
考虑这个.你有迁移
class ChangeFromPartnerAppliedToAppliedAt < ActiveRecord::Migration def up User.all.each do |user| user.applied_at = user.partner_application_at user.save end end
当然这样运行得很好.之后,您需要一个模式更改
class AddAcceptanceConfirmedAt < ActiveRecord::Migration def change add_column :users,:acceptance_confirmed_at,:datetime end end class User < ActiveRecord::Base before_save :do_something_with_acceptance_confirmed_at end
对于你,没有问题.它运行完美.但是,如果您的同事今天提到这两个,那么没有运行第一次迁移,他会在运行第一次迁移时收到此错误:
rake aborted! An error has occurred,this and all later migrations canceled: undefined method `acceptance_confirmed_at=' for #<User:0x007f85902346d8>
这不是一个团队的球员,他会修复你介绍的bug.你应该怎么做?
解决方法
最佳做法是:不要在迁移中使用模型.迁移改变了AR映射的方式,所以不要使用它们.用sql完成所有操作.这样它总是会奏效的.
这个:
User.all.each do |user| user.applied_at = user.partner_application_at user.save end
我会这样做
update "UPDATE users SET applied_at=partner_application_at"