这是方案
生产/登台代码在版本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字段。
最好的办法是什么?
答案 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 }