我需要迁移一些数据。我需要解密一些字段(这没问题)但是当我完成后我需要更新模型以使用不同的数据访问策略。
有没有办法避免两次部署? (一个用于迁移,另一个用于迁移完成后的模型更新?)我需要在迁移中使用旧模型,但之后我需要新模型。
答案 0 :(得分:2)
您可以在迁移中添加虚拟ActiveRecord
模型。然后,您的迁移不再依赖于原始模型及其实现。这允许您更新原始模型中的代码。
这样的事情:
class MigrateFooOnBar < ActiveRecord::Migration
class Bar < ActiveRecord::Base
def foo_migration
self.foo = some_deprecated_code
end
end
def up
add_column :bars, :foo
Bar.find_each do |bar|
bar.foo_migrate
bar.save!
end
end
# ...
end
但这并不能解决核心问题:迁移永远不会在部署应用程序的同一时间运行。部署应用程序时,执行迁移的步骤在切换到新代码和Rails应用程序重新启动之前或之后运行。
根据您的迁移需要多长时间 - 并且它可以在大表上运行几分钟(和几小时) - 您的应用将面临在较新的数据库架构上运行旧代码的情况,或者必须运行新代码旧的数据库架构。
为避免在运行此类迁移时让应用程序脱机,您必须部署多个步骤: