kikeda1104's blog

備忘録・技術に関することを書いています。(webエンジニア)

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作成

f:id:kikeda1104:20170630224831p:plain

model rice作成

f:id:kikeda1104:20170630232206p:plain

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

https://railsguides.jp/active_record_migrations.html#%E4%BB%A5%E5%89%8D%E3%81%AE%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E9%80%86%E8%BB%A2%E3%81%99%E3%82%8B