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 のよーなことが書いてあったような気がした。「カラムがそもそもないのに削除の処理なんてできないよ!」ということだ。

 それじゃあ、やり直しできないじゃん・・・。

 

<原因>

 該当するマイグレーションファイルには

class AddColumnsToHoges < ActiveRecord::Migration
 def change
 add_column :hoges, :example, :string
 add_column :hoges, :name, :string
 add_column :hoges, :hogehoge :string
 end
end

 このようにchangeメソッドでadd_columnを記述してました。

 

 前提として、マイグレーションファイルのバージョン変更のメソッドはup/ down/ change の3つがある。

 upとdownは自分でマイグレーションファイルのup/downの処理を指定する際に使うのである。

 upにはこれから変更を加えるバージョンUPの時の指示を書き、downにはバージョンDOWNの指示として削除だったり、元に戻すカラム情報を書き込んでいきます。

class AddNicknameToUsers < ActiveRecord::Migration
 def up
  change_column :hoges, :hogehoge, :string
 end
 def down
  change_column :hoges, :hogehoge, :integer
 end
end

 こうすることで「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 に変えてしまえばいい。」

 

class AddColumnsToHoges < ActiveRecord::Migration
 def up
 add_column :hoges, :example, :string
 add_column :hoges, :name, :string
 add_column :hoges, :hogehoge, :string
 end
end

 こう書き変えて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