Migrationの限界

Railsで一番気に入ってるのはMigrationの機能なんですが、こないだうまくいかないのを経験したという話。

モデルをいろいろ書き換えてる。DBの構造も変えるので、Migrationもできていく。で、一段落ついたところで、デプロイすることにしようとする。→うまくいかない。つまり、migrationが古い(そのときの)バージョンのモデルじゃないと動かないようになっていることがある。

Migration1でモデルを使ってデータの移行をしている。ところが、現在の最新版のモデルはMigration2が適用されてるのが前提で、callbackとかvalidationとかでMigration2で追加したカラムを使うようになってて、Migration1の中から使おうとするとエラーになってしまう、みたいなパターン。

困りました。

多分、一番いいのは、DBの変更をこまめにdeployしてあげることだと思うんだけど。そもそも配布するアプリケーションとかだと最新版のコードだけをもとにDBを構築することになるわけで。そのとき、過去のバージョンに依存してると、やっぱりはまる。わりと本質的な問題じゃないだろうか。


http://guides.rubyonrails.org/migrations.html#using-models-in-your-migrations

一応、ドキュメントにはこの問題について言及があって、ワークアラウンドとしてはMigrationでモデルを使うときにはモデルをMigrationの中で定義するといいよーって書いてある。そういう感じでやれば、まあうまくいくと思う。でもこれ、絶対めんどくさすぎるよね。Migration作るたびに、いちいちモデルの定義から始めるとか、ちょっと・・・。


こう、一つずつバージョンをあげながらMigrationして回る機能とかあると、うまくいくような気がします。


あ、私が問題にぶちあたったときには、一度Validationを消したバージョンをコミットするはめになりました。ものすごく残念な感じ。