背景
テーブルを 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しても中に入っていたデータまで戻ってくるわけではない。