oma*_*oma 14 ruby data-migration ruby-on-rails rails-migrations
有时,需要进行数据迁移.随着时间的推移,使用域模型的代码更改和迁移不再有效,迁移失败.迁移数据的最佳做法是什么?
我试过一个例子来澄清问题:
考虑一下.你有一个迁移
class ChangeFromPartnerAppliedToAppliedAt < ActiveRecord::Migration
def up
User.all.each do |user|
user.applied_at = user.partner_application_at
user.save
end
end
Run Code Online (Sandbox Code Playgroud)
当然,这完全没问题.稍后,您需要更改架构
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
Run Code Online (Sandbox Code Playgroud)
对你来说没问题.它完美运行.但是,如果您的同事今天同时进行了这两项迁移,但尚未运行第一次迁移,那么在运行第一次迁移时会出现此错误:
rake aborted!
An error has occurred, this and all later migrations canceled:
undefined method `acceptance_confirmed_at=' for #<User:0x007f85902346d8>
Run Code Online (Sandbox Code Playgroud)
那不是团队合作者,他将修复你介绍的错误.你应该怎么做?
Sal*_*lil 14
这是一个完美的例子 Using Models in Your Migrations
class ChangeFromPartnerAppliedToAppliedAt < ActiveRecord::Migration
class User < ActiveRecord::Base
end
def up
User.all.each do |user|
user.applied_at = user.partner_application_at
user.save
end
end
Run Code Online (Sandbox Code Playgroud)
米沙的评论后编辑
class ChangeFromPartnerAppliedToAppliedAt < ActiveRecord::Migration
class User < ActiveRecord::Base
end
def up
User.update_all('applied_at = partner_application_at')
end
end
Run Code Online (Sandbox Code Playgroud)
Chu*_*ckE 13
最佳做法是:不要在迁移中使用模型.迁移会改变AR映射的方式,因此根本不要使用它们.用SQL做到这一切.这样它总能工作.
这个:
User.all.each do |user|
user.applied_at = user.partner_application_at
user.save
end
Run Code Online (Sandbox Code Playgroud)
我会这样做的
update "UPDATE users SET applied_at=partner_application_at"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5239 次 |
| 最近记录: |