26
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-07-14

はい。どうも。

ちぇんじ

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

動くわー。まじかー。

まとめ

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

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

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

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

26
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?