Ruby on rails rails迁移版本兼容性

Ruby on rails rails迁移版本兼容性,ruby-on-rails,migration,backwards-compatibility,Ruby On Rails,Migration,Backwards Compatibility,下面是一个场景 生产/暂存代码位于版本X上 代码的第X版 # order model class Order < ActiveRecord::Base has_many :payment_transactions # has column for check_number def update_report ReportTable.where(:order_id => id).first.update_attributes(:check_number =>

下面是一个场景

生产/暂存代码位于版本X上

代码的第X版

# order model
class Order < ActiveRecord::Base
  has_many :payment_transactions
  # has column for check_number

  def update_report
    ReportTable.where(:order_id => id).first.update_attributes(:check_number => check_number)
  end
end

# payment_transaction model
class PaymentTransaction < ActiveRecord::Base

end
代码的版本X+10(当前)

在X+10迁移之前,付款交易不会获得支票号码字段


处理这个问题的最佳方法是什么?

我会对X+5迁移的
update\u报告
调用进行注释,运行它,然后在完成后在rails控制台上运行代码片段

或更改迁移以执行直接SQL查询:

execute "update report_tables set check_number = x.check_number ...."

如果无法避免迁移中的模型,请将X+5迁移更改为:

Order.all.each do |o|
  ReportTable.where(:order_id => o.id).first.update_attributes(:check_number => o.check_number)
end

这将继续引用订单的check number属性,该属性当时应该仍然存在。

我在X+5中移动了This code表单迁移

Order.all.map{|x| x.update_report }
在X+10中进行迁移

# migration
add_column :payment_transactions, :check_number, :integer
Order.all.map{|x| x.update_report }

这种方法的问题是我添加了一个简单版本的更新报告。那就复杂多了。
Order.all.each do |o|
  ReportTable.where(:order_id => o.id).first.update_attributes(:check_number => o.check_number)
end
Order.all.map{|x| x.update_report }
# migration
add_column :payment_transactions, :check_number, :integer
Order.all.map{|x| x.update_report }