最近我迁移到了一个列来设置默认值。
def change
change_column :table, :column, :integer, :default => 0
end
然后我想回滚这个改变:
be rake db:rollback RAILS_ENV=test STEP=2
== AddDefaultValueToPriceTiersRegistrationCountAttribute: reverting ==========
rake aborted!
StandardError: An error has occurred, all later migrations canceled:
ActiveRecord::IrreversibleMigration
ActiveRecord::IrreversibleMigration: ActiveRecord::IrreversibleMigration
我在Active Record文档中看到您可以处理的更改,ActiveRecord不知道如何撤消。我想了解如何确定它无法处理的更改。我希望自动知道。类似的东西:
rake db:migrate
---- migration successful, but i'm sorry but i don't know how to reverse it ----
同样,我如何确定ActiveRecord是否知道如何回滚迁移,其次是否有一个工具可以告诉我它是否不能?
答案 0 :(得分:3)
要让Rails回滚迁移,需要做以下两件事之一:
您的迁移包括up
和down
次操作,这些操作明确告诉Rails如何执行down
迁移,或者......
Rails可以推断如何撤消change
迁移中导致的更改。
在第二种情况下,或多或少常识:你的手术是否可逆?如果是这样,Rails可能会回滚。如果没有,Rails并不神奇,并且基于单行
change_column :table, :column, :integer, :default => 0
在迁移运行之前,Rails无法推断出该列的类型或其他属性。如果你无法告诉这一行改变了什么,Rails也不能。
一般来说,如果你正在创造一些东西,那么" down"迁移是显而易见的:破坏创建的东西。如果您删除/修改某些内容,Rails无法在修改之前知道状态是什么,并且无法自动回滚。
答案 1 :(得分:0)
我如何确定ActiveRecord是否知道如何回滚迁移?其次是否有一个工具可以告诉我它是否不能?
冒着看似滑稽的风险,我会说这个工具是rake db:rollback
由于迁移可以包含任意代码,因此您不应相信任何迁移都可以在不进行实际测试的情况下撤消。