【Rails】migrationファイルを削除してしまってロールバックできない時の対処法
ロールバック前にマイグレーションファイルを削除してしまいロールバックできなくなってしまったので対処法を残しておきます。
そもそもちゃんとコミットを残しておけばgit checkout するだけでokなので、こまめなコミットを積んでおくの大事です(自戒)。
結論
ロールバック用のマイグレーションファイルを手動で作成するとロールバックできる。 ただし、方法として100%正しいという自信がないです。 他に良い方法があればコメントで教えていただけると幸いです。
手順
- 削除してしまったmigrationファイルの
Migration IDを確認 - 確認した
Migration IDでmigrationファイルを手動で作成 - 作成したmigrationファイルの中身を記述
- ロールバック
1. 削除してしまったmigrationファイルのMigration ID を確認
rails db:migrate:status で削除してしまったmigrationファイルのMigration ID を確認します。
$ rails db:migration:status Status Migration ID Migration Name -------------------------------------------------- ... up 20210531231050 Remove omniauth columns from users up 20230413204250 ********** NO FILE ********** # この行のMigration IDをメモ
削除したmigrationファイルのMigration ID は20230413204250 だと確認できました。
2. 確認したMigration ID でmigrationファイルを手動で作成
確認したMigration ID でmigrationファイルを作成します。
この時、Migration ID_英小文字.rb の形でファイルを作成します。
英小文字の部分は任意の文字列でok- ファイル名を元に指定した
英数字を元にmigrationファイルのクラス名が決められる - 作成するディレクトリは
db/migrate/に作成(他のmigrationファイルと同じディレクトリ)
$ cd app_name $ touch db/migrate/20230413204250_dummy.rb
3. 作成したmigrationファイルの中身を記述
作成したmigrationファイルの中身を記述します。
あくまでロールバックするためだけのmigrationファイルなのでchange メソッドの中身は空でokです。
ファイル名の末尾に_dummy を付けたのでクラス名はDummy クラスで記述します。
# db/migrate/20230413204250_dummy.rb class Dummy < ActiveRecord::Migration[6.1] def change end end
4. ロールバック
migrationファイル修正後のマイグレーションの状態を確認します。
$ rails db:migrate:status Status Migration ID Migration Name -------------------------------------------------- ... up 20210531231050 Remove omniauth columns from users up 20230413204250 Dummy # ロールバック対象のマイグレーション
migrationファイルを作成する前はMigration Name がNO FILEと表示されていましたがDummy と表示されるようになりました。
このMigration Name はmigrationファイル内のクラス名を元に自動で付与されるようです。
ここからは通常のロールバック作業です。
$ rails db:rollback $ rails db:migrate:status Status Migration ID Migration Name -------------------------------------------------- ... up 20210531231050 Remove omniauth columns from users down 20230413204250 Dummy # ロールバックされている
これで無事ロールバックできました。
感想
マイグレーションがどのように生成されるのかなんとなく分かったので良かった! 前にも同じことをやってしまったのでまたいつかやってしまいそう...こまめなコミットを心掛けます。