この記事はアピリッツの技術ブログ「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構造を見てみると、
各カラムにコメントが入ります。
