migrationファイルがROLL BACKできない!?
状況のスクショとかできなかったのでメモだけ残す。
<発端>
DBのテーブルにカラムを追加しようとしてAddColumnHogeのマグレーションファイルを作成して、add_column :hoges, :hogehoge :string とか3つのカラム情報を書き込んだ。そして「 $ bundle exec rake db:migrate 」
しかしDBをみてもカラムが追加されていない。あれ?
マイグレーションファイルをよく見ると:hogehoge の後にカンマをつけるのを忘れていた。
あちゃ〜、ということでマイグレーションファイルをやり直そうと思い、ROLL BACKの手続きを実行。⇨ ERROR
「!?」
<状況>
エラー文を読むと、hogehoge column doesn't exist のよーなことが書いてあったような気がした。「カラムがそもそもないのに削除の処理なんてできないよ!」ということだ。
それじゃあ、やり直しできないじゃん・・・。
<原因>
該当するマイグレーションファイルには
このようにchangeメソッドでadd_columnを記述してました。
前提として、マイグレーションファイルのバージョン変更のメソッドはup/ down/ change の3つがある。
upとdownは自分でマイグレーションファイルのup/downの処理を指定する際に使うのである。
upにはこれから変更を加えるバージョンUPの時の指示を書き、downにはバージョンDOWNの指示として削除だったり、元に戻すカラム情報を書き込んでいきます。
こうすることで「rake db:migrate」(up)の時の指示と「rake db:rollback」(down)の時の指示をそれぞれ具体的に出すことができるのですね。
さて、changeメソッドではなぜdownの指示を書かなくていいのか。それはROLLBACKした時に、自動でchangeする以前の状態に戻すよう設定されているからである。(add_columnを反転させてremove_columnを実行すると言う。)
upとdownがひとまとめ。この機能が今回の原因である。
「add_column :hoges, :hogehoge :string」 のカンマ忘れのせいでhogehogeカラムが作成されなかった。なのにROLLBACKでchangeメソッドの反転機能を作動させようとしても、変更がされてないから元に戻れない!
そのためのエラーだった・・・。
<解決編>
マイグレーションファイルにdef change ~ end でchangeメソッドが書かれているからROLLBACKがうまくいかない。ならば
「メソッドをup / down に変えてしまえばいい。」
こう書き変えてROLL BACKを実行したらいけました。多分、downにしてもいけるのだと思います。
とにかくchangeメソッドの反転設定が悪作用していたので、それさえなくしたらROLL BACKが作動するんですね。
自分的にはROLL BACKなのでdownじゃないといけないのかと思ったのですが、upでもいいんですね。
downは巻き戻した後の状態を指示するので、書かなかったら「無」の状態にただ巻き戻るから、ROLL BACKできるってことですかね。
<結論>
マイグレーションファイルのchangeメソッドを使う際、ROLL BACKする時にエラーが起きる可能性があるから気をつけよう。
changeメソッドの部分をup / down に書き換えても問題ないよ。
以上。
<参考サイト> ありがとうございました。
https://qiita.com/takuyanin/items/6d51ffb4078a417fed35
https://qiita.com/tkr_ld/items/f1c0b3bad6a49bd7894a
https://www.javadrive.jp/rails/model/index5.html
http://tanihiro.hatenablog.com/entry/2014/01/10/182122