やりたかったこと
アプリケーションを作成するにあたり、userの情報を格納するためのusersテーブルが必要になったので以下のようにコマンドを打ち込んでmodelとマイグレーションファイルとRSpec用のモデルスペックファイルとFactory Bot用のファクトリファイル作成しようとした。
rails g model User name:stiring email:string password_digest:string
その後、DBに反映させるためにrails db:migrate
を実行したら以下のようなエラーが出た
StandardError: An error has occurred, this and all later migrations canceled:
undefined method `stiring' エラー文が続く...
解決までの道のり
1.エラー文の解読
上記のエラー文をよく見てみると、自分のタイピングミスでstiringなんてメソッド(今回の場合は、データ型)は存在しないよとおこられた。
2.migrationのステータスの確認とファイルの削除
そのマイグレーションファイルを削除するためにまずは、downになっていることを確認しようと思ってrails db:migrate:statusでマイグレーションファイルの状況を確認すると以下のようになっていた
Status Migration ID Migration Name
--------------------------------------------------
up 20230815080323 Create tasks
up 20230817012833 Add expiry date to tasks
up 20230817014502 Remove expiry date from tasks
up 20230817023012 Add expired at to tasks
up 20230817062638 Add status to tasks
up 20230819041152 Add priority to tasks
up 20230819144335 Add index tasksnot started yet
up 20230819144533 Remove not started yet to tasks
up 20230819144709 Add index tasks not started yet
down 20230821015454 Create users
まだ、rails db:migrate実行前なのでdownになっていた。本来なら、ファイルがdown状態の時はマイグレーションファイルに直接書き込み、stiringをstringに訂正して、再度rails db:migrate
を実行すればよかったのだが、自分がマイグレーションファイルの理解があまりできていなかったので、失敗したらファイルがdownになっているのを確認してからrmコマンドでファイルを消た。
再度rails g model とrails db:migrateを実行
stringに綴りのところに気をつけながら、再度、rails g model User name:string email:string password_digest:string
を実行し、その後、rails db:migrateを実行すると以下のようにschemaに無事に反映された。
create_table "users", force: :cascade do |t|
t.string "name"
t.string "email"
t.string "password_digest"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
end
まとめ
・マイグレーションファイルがdown状態の時は、直接、マイグレーションファイルに書き込んで変更しても良い。
・マイグレーションファイルをupからdownにする方法は以下の通り
1.rails db:migrate:status
で状況の確認及びdownさせたいマイグレーションファイルのidを取得する
2.rails db:migrate:down VERSION=downさせたいマイグレーションファイルのid番号
でdownさせる
3.訂正が終わったら、rails :db:migrate
でupさせ、schemaファイルに反映されているかを確認する
3.おまけconflictとforceについて
rails g model User name:string email:string password_digest:string
を再度実行した時にターミナルには以下のように表示された
この時に赤文字で表示された赤文字のconflict
と黄色文字のforce
が気になったので調べてみた結果を以下のようにまとめてみた。
conflict
:前にタイピングミスでrails g model
実行時に生成されたRSpec用のモデルスペックファイルとFactory Bot用のファクトリファイルがすでに存在しており、今回正しい表記でrails g model
をした際に作られたRSpec用のモデルスペックファイルとFactory Bot用のファクトリファイルが再度生成され、それぞれが競合(conflict)が発生しています。という意味での赤文字での警告だった
その下にあるOverwriteのところで上書きしますか?みたいな表記でenterを押した
force
:enterを押したことで強制的に後者で作られたRSpec用のモデルスペックファイルとFactory Bot用のファクトリファイルの内容に上書きしたという意味。