移行は元に戻せないため(例外をスローしたくないため)、空のダウン関数を使用してRails3.2移行を生成しました。移行は正常に実行されましたが、効果がありません。ロールバックしてdb:migrateを再度実行すると、効果が適用されます。
空のdown関数に何もしないコードを入力することでこれを簡単に解決しましたが、それでもかなり醜いです。
なぜこれが起こるのか誰かが知っていますか?これはレールのバグですか?
移行は元に戻せないため(例外をスローしたくないため)、空のダウン関数を使用してRails3.2移行を生成しました。移行は正常に実行されましたが、効果がありません。ロールバックしてdb:migrateを再度実行すると、効果が適用されます。
空のdown関数に何もしないコードを入力することでこれを簡単に解決しましたが、それでもかなり醜いです。
なぜこれが起こるのか誰かが知っていますか?これはレールのバグですか?
データベースの破壊を防ぐために例外がスローされます。データベースが元に戻せない場合は、おそらくそれが正しいことです。あなた#down
はこのように見えるかもしれません:
def down
raise ActiveRecord::IrreversibleMigration, "Explain why its irreversable!"
end
不可逆的な移行について明確に通知し、その背後にある理由を説明するため、他の人の頭痛の種を大幅に減らすことができます:)
編集: Rails3.2.3のこの動作を確認できません。なしでいくつかの異なる移行を作成しましたが#down
、例外は発生しませんでした。多分それはあなたのコードの何かであり、あなたは少しは見せませんでした。
編集2:要約すると、アップ/ダウン方式を使用している場合は、レイズする責任がありますActiveRecord::IrreversibleMigration
。それ以外の場合は、何も起こりません(#down
ARで定義されている場合はnilが返されます)。を使用すると、動作が異なります#change
。場合によっては、https#inverse
://github.com/rails/rails/blob/565bfb9cd49285ebaa170141b4996c22ba81de43/activerecord/lib/active_record/migration/command_recorder.rb#L39で定義されているため、上記の例外が発生する可能性があります。