その他
    ホーム 技術発信 DoRuby migrationファイルの記法メモ

    migrationファイルの記法メモ

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    Ruby on Rails でDBのテーブル作成・カラム編集などに使う

    migrationファイル。ファイルを作っておけば「rake db:migrate」 のコマンドで色々な対応が出来ますが、

    それぞれ書き方があり、今までにすこし引っかかったものを中心にまとめてみました。

     change と up/down

    changeとup/downはどちらもmigration実行時・ロールバック時の処理を記述するメソッドです。

    changeの場合

    class AddNameToPlayers < ActiveRecord::Migration
      def change
        add_column :players, :name, :string
      end
    end  

    up/downの場合

    class AddNameToPlayers < ActiveRecord::Migration
      def up
        add_column :players, :name, :string
      end
    
      def down
        remove_column :players, :name
      end
    end  

    up/downはそれぞれ実行時・ロールバック時の操作をかく必要がありますが、

    changeは実行時だけの操作を書くと、ロールバック時に処理を反転させて実施してくれます。とっても便利です。

    なので、全部changeで書いていた所、ある時エラーになりました。

    class RemoveNameToPlayers < ActiveRecord::Migration
      def change
        remove_column :players, :name    <- ロールバックできない
      end
    end  

    カラムのremove処理などは、changeだけだと、カラムの型情報等が含まれないため、反転出来ないのが原因でした。

    removeのmigrationの時はup/downを使うようにしましょう。

     定型外の型

    マイグレーションで使えるデータ型には以下のようなものが用意されています。

    integer
    float
    string
    text
    date
    time
    boolean
    ...  

    ただある時、integer型のカラムをBIGINT型に変更したい、となったとき、

    bigintはそのままmigrationファイルに記述してもダメでした。

      def change
      	change_column :bank, :money, "BIGINT UNSIGNED"
      end 

     カラム位置指定

    普通にmigrationファイルでカラムを増やすと、どんどん最後尾にカラムが足されて行きます。

    その際、「このカラムは、カラムAとカラムBの間に入れたい!」となった時。

    afterを使いました。

      def change
        add_column :test_table, :insert_column, :string, after: "column_a"
      end

    このようなmigrationファイルにすると、column_aの後にinsert_columnが追加されます。

    おまけ コメント

    DBが増えてくると、このカラムは何のカラムだったか、と分からなくなってきます。

    migrationファイルから、コメントを付けておく事が出来ます。

      def change
        add_column :test_table, :encrypted_password, :string, comment:"パスワード"
        add_column :test_table, :name, :string, comment:"ログインアカウントネーム"
      end

    このようなmigrationファイルを作り、DB構造を見てみると、

    各カラムにコメントが入ります。