DBのマイグレーション時に、changeでupとdownを表現する方法

More than 5 years have passed since last update.

はい。どうも。


ちぇんじ

Railsのmigration、あるときから(3.xからだっけ)changeというメソッドが使われるようになった。

たとえばcreate_tableなんかだと、upの時にはテーブル作成をして、downの時にはおもむろにテーブルをdropしてくれる、っていう楽チン仕様だ。

だけど、たとえばupdownで行う動作が違う場合。

upの時はカラム追加しつつデータ移行もやりたい、だけどdownの時はカラム削除だけ。みたいな。

これを上手く表現する方法がいまいち想像がつかなくて、結局これまで通り使えるupdownで書いちゃうっていう、もやっとした感じのコードになっちゃってた。


そこで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

動くわー。まじかー。


まとめ

作業コスト的にはぶっちゃけupdownって書くのもreversibleを使うのも変わらないと思うけど、せっかくだしreversible使うのが良いんじゃないの。

そもそもupdownは現状のRails Guidesだと、


Alternatively, you can use up and down instead of change:


ということになってるっぽいし。

だいたいそんな感じ( ˘ω˘)