我生成了一个带有空下来功能的 rails 3.2 迁移,因为迁移是不可逆的(而且我不想抛出异常)。我成功运行了迁移,但没有任何效果。当我回滚并再次运行 db:migrate 时,效果确实适用。
我通过用什么都不做的代码填充空的向下函数轻松解决了这个问题,但它仍然很丑陋。
有谁知道为什么会这样?这是一个rails错误吗?
我生成了一个带有空下来功能的 rails 3.2 迁移,因为迁移是不可逆的(而且我不想抛出异常)。我成功运行了迁移,但没有任何效果。当我回滚并再次运行 db:migrate 时,效果确实适用。
我通过用什么都不做的代码填充空的向下函数轻松解决了这个问题,但它仍然很丑陋。
有谁知道为什么会这样?这是一个rails错误吗?
抛出异常是为了防止破坏您的数据库,如果它是不可逆转的,那么这可能是正确的做法。你#down
可能看起来像这样:
def down
raise ActiveRecord::IrreversibleMigration, "Explain why its irreversable!"
end
这将为其他人省去很多麻烦,因为它清楚地通知了不可逆转的迁移并解释了其背后的原因:)
编辑:我无法确认 Rails 3.2.3 的这种行为。我已经创建了几个没有 的不同迁移#down
,并且没有引发异常。也许这是您的代码中的某些内容,您没有显示出来。
编辑 2:回顾一下,当你使用 up/down 方法时,你有责任提高ActiveRecord::IrreversibleMigration
. 在其他情况下,什么都不会发生(#down
在 AR 中定义只会返回 nil)。使用#change
. 在某些情况下,可以通过在此处定义来引发上述异常#inverse
:https ://github.com/rails/rails/blob/565bfb9cd49285ebaa170141b4996c22ba81de43/activerecord/lib/active_record/migration/command_recorder.rb#L39这是预期的行为。