ActiveRecord::PendingMigrationError
You have 2 pending migrations:
2件の保留中のmigrationファイルがある。
→rails db:createは終わっているが、rails db:migrateしていないでしょと言われている。何をrails db:migrateしていないのかを確認するために
rails db:migrate:statusを行う
*
migrationは、SQL文を書かずにデータベースの構造を変更したり、元に戻したりできる
実行後の内容
Status Migration ID Migration Name
up 20220815060217 ********** NO FILE **********
up 20220815060220 ********** NO FILE **********
up 20220815073501 ********** NO FILE **********
down 20220815144028 Devise create admin users
down 20220815144031 Create active admin comments
Status欄に「up」と表示されているmigrationファイルは、データベースに適用済みです。
一方、Status欄に「down」と表示されているmigrationファイルは適用されていません。
migrationファイルが増えてきたり、up/downで編集することが多くなったときは、再現性(冪等性:べきとうせい)を確認する。
再現性を確認するためには、データベースを一度削除してから、すべてのmigrationファイルを適用して、実行結果を確認すれば良い。
データベースを一度削除したり再適用したりといった作業が大変そうなイメージですが、railsではbin/rails db:migrate:resetコマンドを実行するだけです。
rails db:migrate:resetを行ったあと
Running via Spring preloader in process 91209
database: active_admin_sample_development
Status Migration ID Migration Name
up 20220815144028 Devise create admin users
up 20220815144031 Create active admin comments
再度rails sを実行すると
エラーが解消され、正常に起動した。
以下
https://qiita.com/Jwataru/items/78074acc463620a2311a
の引用
三つのパターン
1.単純にrails db:createのあとrails db:migrateし忘れている
マイグレーション実行の下記のコマンドを打ち込みましょう
$ rails db:migrate
2.すでにmigrationが完了している(up)状態でマイグレーションファイルを更新しrails db:migrateしてしまった
方法1 既存のテーブルを全削除し、再度マイグレーションの状態をupにする下記のコマンドを打ち込みましょう
$ rails db:migrate:reset
方法2(未実施) マイグレーションの最新のものだけ実行を取りやめて編集可能(down)にするコマンドrails db:rollbackののち、マイグレーションファイルの更新コマンドrails db:migrateを打ちましょう
$ rails db:rollback
$ rails db:migrate
※マイグレーションの状態を調べるコマンドは下記の通りです
$ rails db:migrate:status
3,マイグレーションファイルの中に入れた外部参照キーが参照するテーブルがない状態でrails db:creatしてしまった
①-1外部参照されるマイグレーションファイルを作成し、app/modelの中のファイルにアソシエーションを追記(または修正)する
①-2マイグレーションファイルから不必要な外部参照キーを消す
②上記①のどちらかの修正のあとに下記コマンドを打ち込みましょう
$ rails db:migrate:reset
4,すでにデータベースにレコードを入れてしまい、それを残したまま修正する方法(補足)
新たに追加したい項目のテーブルを作成し、本来追加したかったテーブルのidを外部キーとする方法をとりましょう。
こちらに助けられました。ありがとうございます。