drop_tableの代わりにActiveRecordMigration#revert
環境
前提
初期からRailsでアプリを作成していて、tableを作成したmigrationもそのアプリが保有していることが前提になります。
modelを途中で消す場合、./bin/rails d model model_name
で消すと作成した際、migration file
も削除される。
途中で、カラムを追加・変更・削除している場合は、./bin/rails db:migrate
が失敗することになり、modelを削除する際には、気をつけないと、migrateを一から実行することができなくなり、復旧することになります。
revert
rails app単体の構成であれば、drop_table
を使ってテーブルを削除するよりも、revert
を使うのが良いと思います。
では、手順ですが、一度作成したmodel、testファイル、該当するコードを削除した後、tableを作成したmigrationは残しておき、新規drop用のmigration fileを準備します。
サンプル
model bread作成
model rice作成
migrate実行とgit commit
./bin/rails db:migrate git add . && git commit -m "add bread and rice models"
model bread削除
./bin/rails d model bread git checkout db/migrate ./bin/rails g migration DropBreadsTable
作成したmigrationをエディタで開く
require_relative '20170629123105_create_breads' # 追記(migrationファイル名は、適切なファイル名に直してください) class DropBreadsTable < ActiveRecord::Migration[5.1] def change revert CreateBreads # 追記 create_breadsをキャメルケースに直してrevertの引数に渡す。 end end
以上です。これで、migrate, rollbackすることができます。
別サンプル
途中で、カラムを追加していた場合のケースも追加しておきます。
breadsにcolumnを追加
./bin/rails g migration AddIsSweetnessToBreads
migration file編集
class AddIsSweetnessToBreads < ActiveRecord::Migration[5.1] def change add_column :breads, :is_sweetness, :boolean, default: false end end
テーブルを削除するmigration fileを作成
require_relative '20170630135043_add_is_sweetness_to_breads' require_relative '20170630134600_create_breads' class DropBreadsTable < ActiveRecord::Migration[5.1] def change revert AddIsSweetnessToBreads revert CreateBreads end end
以上です。
./bin/rails db:migrate ./bin/rails db:rollback STEP=3 ./bin/rails db:migrate
複数テーブルの操作をmigrationに書き込んでいる場合
このケースだと対応はできないです。
migration file
は、1テーブルの操作に制限して、プロジェクトメンバーに周知して守らせる必要がありそうです。
(上記をオススメしますが、migration fileの書き方で、dropしないテーブルに関する操作をrevert後にコピーしてくることで復旧できそうなので、
今度改めて、追記します。)
参考
http://api.rubyonrails.org/classes/ActiveRecord/Migration.html#method-i-revert