ruby-on-rails – 迁移DATA – 不仅仅是模式,Rails

有时需要数据迁移.随着时间的推移,使用域模型的代码更改和迁移不再有效,迁移失败.迁移数据的最佳做法是什么?

我试着举个例子来澄清问题:

考虑这个.你有迁移

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"

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...