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