背景
テーブルを DROP する migration をつくることになった。
def up
内では単に drop_table
できる。
しかし、rake db:rollback
でテーブルを再作成できるようにしたい場合、def down
内にスキーマの情報が必要になる。
スキーマはテーブルを作ったときや更新したときの migration ファイルに既に書いているので、コピペせずに定義を流用したい。
どうやるか
require_relative "20101010101010_create_foo"
require_relative "20111111111111_add_bar_to_foo"
class DropFoo < ActiveRecord::Migration
def up
drop_table :foo
end
def down
CreateFoo.change(:up)
AddBarToFoo.change(:up)
end
end
注意が必要なこと
-
change
メソッドを使って:up
や:down
を渡す。up
やdown
というメソッドも生えているが、トランザクションは発生せずにnil
が返ってくる様子。 -
ActiveRecord::Migrator
で指定の migration を実行することもできるが、こうするとschema_migrations
テーブルも更新され、migration 自体を実行したことになってしまう。中身だけ流用したい場合はこの方法が良さげ。 - 当然だが、
rake db:rollback
しても中に入っていたデータまで戻ってくるわけではない。