ロールバック前にマイグレーションファイルを削除してしまいロールバックできなくなってしまったので対処法を残しておきます。
そもそもちゃんとコミットを残しておけば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 # ロールバックされている
これで無事ロールバックできました。
感想
マイグレーションがどのように生成されるのかなんとなく分かったので良かった! 前にも同じことをやってしまったのでまたいつかやってしまいそう...こまめなコミットを心掛けます。