是什么决定了ActiveRecord可以在变更中回滚的内容

时间:2015-08-13 17:46:40

标签: ruby-on-rails activerecord

最近我迁移到了一个列来设置默认值。

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是否知道如何回滚迁移,其次是否有一个工具可以告诉我它是否不能?

2 个答案:

答案 0 :(得分:3)

要让Rails回滚迁移,需要做以下两件事之一:

  1. 您的迁移包括updown次操作,这些操作明确告诉Rails如何执行down迁移,或者......

  2. Rails可以推断如何撤消change迁移中导致的更改。

  3. 在第二种情况下,或多或少常识:你的手术是否可逆?如果是这样,Rails可能会回滚。如果没有,Rails并不神奇,并且基于单行

    change_column :table, :column, :integer, :default => 0
    

    在迁移运行之前,Rails无法推断出该列的类型或其他属性。如果无法告诉这一行改变了什么,Rails也不能。

    一般来说,如果你正在创造一些东西,那么" down"迁移是显而易见的:破坏创建的东西。如果您删除/修改某些内容,Rails无法在修改之前知道状态是什么,并且无法自动回滚。

答案 1 :(得分:0)

  

我如何确定ActiveRecord是否知道如何回滚迁移?其次是否有一个工具可以告诉我它是否不能?

冒着看似滑稽的风险,我会说这个工具是rake db:rollback

由于迁移可以包含任意代码,因此您不应相信任何迁移都可以在不进行实际测试的情况下撤消。