change_columnでmigrateしたらrollbackできなかった

change_columnでmigrateしたあとにrollbackしようとしたらrollbackできなかった…。
そのときのエラーがこれ。

[] be rake db:rollback
== 20160915054652 AddTimestampsToMember: reverting ============================
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

ActiveRecord::IrreversibleMigration


???だったが、
この「ActiveRecord::IrreversibleMigration」エラーというのが「不可逆なマイグレーション」、
つまり取り消せないマイグレーションですよ!ということらしい。


いろいろ調べてみたら、
「changeでは特定のメソッドでしかrollbackが利かない」、ということがわかりました。
railsguides.jp

add_column
add_index
add_reference
add_timestamps
add_foreign_key
create_table
create_join_table
drop_table (ブロックを渡す必要あり)
drop_join_table (ブロックを渡す必要あり)
remove_timestamps
rename_column
rename_index
remove_reference
rename_table

上記であれば、rollbackするとどうなるかをActiveRecordが判断してrollbackしてくれるけど、
それ以外だと自分で定義しないといかんということみたいです。
(今回change_columnを使ってるためにrollbackできなかったっぽい)

じゃあ、rollbackするときはこうして!っていうのを書くときどうするかというと、
reversibleメソッドを使う、もしくはupメソッド・downメソッドを書けばいいそう。


今回はup・downで、upメソッドにmigrateしたい処理、
downメソッドにrollbackするときの処理を書いて、無事migrate→rollbackできるようになりました。


参考にさせていただきました:
blog.jnito.com