我想知道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] 删除。
我来说两句