概要
$ rails db:rollback
や$ rails db:migrate:down VERSION=マイグレーションID
時に以下のようなエラーで正しくrollback出来なかったときの対処法.
ActiveRecord::UnknownMigrationVersionError:
No migration with version number マイグレーションID
原因
対象となるマイグレーションIDのマイグレーションファイルが見つからなく、downが出来ないよ、と怒られている.
対処法
消したいマイグレーションIDを見つける
$ rails db:migrate:status
そうすると
status Migration ID Migration Name
︙ ︙ ︙
up 200427074212 ********** NO FILE **********
上記のように「NO FILE」となっているマイグレーションIDがあるはず.
この例の場合、「200427074212」です.
マイグレーションファイルを作る
「db/migrate」ディレクトリ内に先程確認したMigration IDのマイグレーションファイルを作成.
$ cd db/migrate
$ touch マイグレーションID_tmp.rb
(例: $ touch 200427074212_tmp.rb)
マイグレーションファイルを編集
作成したみグレーションファイルに以下の内容を書き込みます.
※ ActiveRecordのバージョンは他のマイグレーションファイルを見て確認してください.
class Tmp < ActiveRecord::Migration[バージョン]
def change
end
end
マイグレーションファイルを削除
下記のコマンドでもう一度マイグレーションを確認します.
$ rails db:migrate:status
status Migration ID Migration Name
︙ ︙ ︙
up 200427074212 Tmp
そうすると「Migration Name」の欄に「Tmp」と表示されるようになっているはず.
その後、下記のコマンドでこのマイグレーションファイルをのステータスを「up」から「down」の状態にしていきます.
$ rails db:migrate:down VERSION=マイグレーションID
($ rails db:migrate:down VERSION=200427074212)
そしてステータスが「down」になっていることを確認する.
$ rails db:migrate:status
status Migration ID Migration Name
︙ ︙ ︙
down 200427074212 Tmp
「down」が確認できたら、マイグレーションファイルを削除します.
$ rm db/migrate/200427074212_tmp.rb
そしてstatusを確認すると
$ rails db:migrate:status
status Migration ID Migration Name
︙ ︙ ︙
(先程のマイグレーションファイルが消えている)
これで成功!
rails db:rollback
等できるようになっているはず!