はい。どうも。
ちぇんじ
Railsのmigration、あるときから(3.xからだっけ)changeというメソッドが使われるようになった。
たとえばcreate_tableなんかだと、upの時にはテーブル作成をして、downの時にはおもむろにテーブルをdropしてくれる、っていう楽チン仕様だ。
だけど、たとえばupとdownで行う動作が違う場合。
upの時はカラム追加しつつデータ移行もやりたい、だけどdownの時はカラム削除だけ。みたいな。
これを上手く表現する方法がいまいち想像がつかなくて、結局これまで通り使えるupとdownで書いちゃうっていう、もやっとした感じのコードになっちゃってた。
そこでreversibleですよ
なんの気なしにRails Guidesを読んでいたら、こんなことが書いてあった。
If you wish for a migration to do something that Active Record doesn't know how to reverse, you can use reversible:
!?
というわけで早速書いてみた。
class ChangeColumnTypeOfTwitterId < ActiveRecord::Migration
  def change
    reversible do |r|
      change_table :users do |t|
        r.up   { t.change :twitter_id, :integer, limit: 8 }
        r.down { t.change :twitter_id, :string }
      end
    end
  end
end
動くわー。まじかー。
まとめ
作業コスト的にはぶっちゃけup``downって書くのもreversibleを使うのも変わらないと思うけど、せっかくだしreversible使うのが良いんじゃないの。
そもそもupとdownは現状のRails Guidesだと、
Alternatively, you can use up and down instead of change:
ということになってるっぽいし。
だいたいそんな感じ( ˘ω˘)