【Rails】migrationファイルを削除してしまってロールバックできない時の対処法

ロールバック前にマイグレーションファイルを削除してしまいロールバックできなくなってしまったので対処法を残しておきます。 そもそもちゃんとコミットを残しておけばgit checkout するだけでokなので、こまめなコミットを積んでおくの大事です(自戒)。

結論

ロールバック用のマイグレーションファイルを手動で作成するとロールバックできる。 ただし、方法として100%正しいという自信がないです。 他に良い方法があればコメントで教えていただけると幸いです。

手順

  1. 削除してしまったmigrationファイルのMigration ID を確認
  2. 確認したMigration ID でmigrationファイルを手動で作成
  3. 作成したmigrationファイルの中身を記述
  4. ロールバック

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 ID20230413204250 だと確認できました。

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 NameNO 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 # ロールバックされている

これで無事ロールバックできました。

感想

マイグレーションがどのように生成されるのかなんとなく分かったので良かった! 前にも同じことをやってしまったのでまたいつかやってしまいそう...こまめなコミットを心掛けます。

参照

Ruby on Rails 『NO FILEのmigrationを削除する方法』 - Qiita