2

移行は元に戻せないため(例外をスローしたくないため)、空のダウン関数を使用してRails3.2移行を生成しました。移行は正常に実行されましたが、効果がありません。ロールバックしてdb:migrateを再度実行すると、効果が適用されます。

空のdown関数に何もしないコードを入力することでこれを簡単に解決しましたが、それでもかなり醜いです。

なぜこれが起こるのか誰かが知っていますか?これはレールのバグですか?

4

1 に答える 1

7

データベースの破壊を防ぐために例外がスローされます。データベースが元に戻せない場合は、おそらくそれが正しいことです。あなた#downはこのように見えるかもしれません:

  def down
    raise ActiveRecord::IrreversibleMigration, "Explain why its irreversable!"
  end

不可逆的な移行について明確に通知し、その背後にある理由を説明するため、他の人の頭痛の種を大幅に減らすことができます:)

編集: Rails3.2.3のこの動作を確認できません。なしでいくつかの異なる移行を作成しましたが#down、例外は発生しませんでした。多分それはあなたのコードの何かであり、あなたは少しは見せませんでした。

編集2:要約すると、アップ/ダウン方式を使用している場合は、レイズする責任がありますActiveRecord::IrreversibleMigration。それ以外の場合は、何も起こりません(#downARで定義されている場合はnilが返されます)。を使用すると、動作が異なります#change。場合によっては、https#inverse://github.com/rails/rails/blob/565bfb9cd49285ebaa170141b4996c22ba81de43/activerecord/lib/active_record/migration/command_recorder.rb#L39で定義されているため、上記の例外が発生する可能性があります。

于 2012-04-09T11:42:06.377 に答える