LoginSignup
2
1

More than 5 years have passed since last update.

既存のマイグレーションからスキーマ定義を流用する

Last updated at Posted at 2016-10-08

背景

テーブルを 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 を渡す。updown というメソッドも生えているが、トランザクションは発生せずに nil が返ってくる様子。
  • ActiveRecord::Migrator で指定の migration を実行することもできるが、こうすると schema_migrations テーブルも更新され、migration 自体を実行したことになってしまう。中身だけ流用したい場合はこの方法が良さげ。
  • 当然だが、rake db:rollback しても中に入っていたデータまで戻ってくるわけではない。
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1