rails迁移版本兼容性

时间:2011-07-03 16:51:26

标签: 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 => check_number)
  end
end

# payment_transaction model
class PaymentTransaction < ActiveRecord::Base

end

版本X + 5代码

# migration
Order.all.map{|x| x.update_report }

版本X + 10代码(当前)

# migration
add_column :payment_transactions, :check_number, :integer

# order model
class Order < ActiveRecord::Base
  has_many :payment_transactions
  # moved the column check_number to payment_transactions

  def check_number
    self.payment_transactions.where(:method => 'check').blank? ? nil : self.payment_transactions.where(:method => 'check').first.check_number
  end

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

# payment_transaction model
class PaymentTransaction < ActiveRecord::Base
  # has column for check_number
end

现在,当我将暂存环境中的代码更新到最新版本(X + 10)并运行迁移时,X + 5上的迁移失败,因为它尝试运行此

def check_number
  self.payment_transactions.where(:method => 'check').blank? ? nil : self.payment_transactions.where(:method => 'check').first.check_number
end

并且在X + 10迁移之前,payment_transaction将不会获得check_number字段。

最好的办法是什么?

3 个答案:

答案 0 :(得分:0)

我会评论{+ 1}}对X + 5迁移的调用,运行它,然后在我完成后在rails控制台上运行代码段。

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

update_report

答案 1 :(得分:0)

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

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

这将继续引用订单的支票编号属性,该属性当时应该仍在那里。

答案 2 :(得分:0)

我最终在X + 5

中移动了此代码格式迁移
Order.all.map{|x| x.update_report }

在X + 10中迁移

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