はい。どうも。
ちぇんじ
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:
ということになってるっぽいし。
だいたいそんな感じ( ˘ω˘)