2

我生成了一个带有空下来功能的 rails 3.2 迁移,因为迁移是不可逆的(而且我不想抛出异常)。我成功运行了迁移,但没有任何效果。当我回滚并再次运行 db:migrate 时,效果确实适用。

我通过用什么都不做的代码填充空的向下函数轻松解决了这个问题,但它仍然很丑陋。

有谁知道为什么会这样?这是一个rails错误吗?

4

1 回答 1

7

抛出异常是为了防止破坏您的数据库,如果它是不可逆转的,那么这可能是正确的做法。你#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. 在某些情况下,可以通过在此处定义来引发上述异常#inversehttps ://github.com/rails/rails/blob/565bfb9cd49285ebaa170141b4996c22ba81de43/activerecord/lib/active_record/migration/command_recorder.rb#L39这是预期的行为。

于 2012-04-09T11:42:06.377 回答