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