使用execute回滚Rails迁移

成祖

我想知道Rails在回滚迁移文件时会执行什么操作(如果它具有execute一些原始SQL语句)。

这是一个人为的示例:

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

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

张国荣

如果查看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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章