2011-07-03 38 views
1

这里是场景导轨迁移版本兼容性

生产/分段代码是关于版本的代码为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 

和payment_transaction会失败在X + 10迁移之前不会获取check_number字段。

最好的处理方法是什么?

回答

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 } 
0

我会对X + 5迁移中的update_report调用发表评论,运行它,然后在完成后在rails控制台上运行代码片段。

或更改迁移到执行直接的SQL查询:如果不能避免在迁移模型,然后,改变X + 5迁移

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

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

这将继续引用该订单的支票号码属性,该属性在那时应该仍然存在。

+0

这种方法的问题是,我添加更新的简单版本报告。那就更复杂了。 – Addy