使用execute回滚Rails迁移

时间:2015-04-20 23:36:54

标签: ruby-on-rails

我想知道Rails在回滚迁移文件时做了什么,如果它有一个带有一些原始SQL语句的execute

这是一个人为的例子:

def change
  add_column :my_table, :new_column
  execute "update my_table set new_column = some_value where some_condition"
end

回滚此迁移时,Rails是否会默默忽略迁移的execute部分?

2 个答案:

答案 0 :(得分:1)

如果查看command_recorder.rb(在活动记录gem中),那么您将看到一些迁移方法(例如add_column)具有相应的invert_foo方法来反转更改。如果没有相应的invert方法,则rails将引发错误。这是因为它无法知道如何反转任意语句。

如果您希望迁移是可逆的,则需要告诉rails如何撤消迁移。一般形式是

reversible do |direction|
  direction.up { ... }
  direction.down {...}
end

可以根据需要多次调用up和down方法,如果方向与正在运行或正在回滚的方向匹配,则只会调用块。

在你的情况下,这只是

reversible do |direction|
  direction.up { execute "..." }
end

如果要删除列,则不需要撤消对列的更改。

答案 1 :(得分:0)

我会尽可能多地假设。您应该将其拆分为向上和向下迁移。

Down应该看起来像这样:

def down
  raise ActiveRecord::IrreversibleMigration
end