【Rails】DBをリセットしてmigrateをやり直す方法


はじめに

Railsで作成したアプリで、一番はじめに作ったモデルのテーブルが間違っていたことに気づいたため、DBをリセットしてmigrateをやり直しました。
以下の記事を参考にやり直すことができました。
参考 Rails:migrateでDBをリセットして最初からつくり直す方法。
参考 【Rails】$rails db:rollbackしたい時の間違えない手順

何が間違っていたのか

deviseでユーザー登録をさせる時に、生年月日のカラム型をstring型にしてしまっていた。このままでも登録は出来たが、生年月日の欄を入力した状態で他の部分のバリデーションに引っ掛かり、エラー文を表示させる画面に移った時に以下の表記。

ターミナルに表示されたエラー
ActionView::Template::Error (undefined method `day' for "{1=>1932, 2=>nil, 3=>nil}":String):

ページを遷移した時に、フォームに入っていた情報がdata型では無かったのでおかしいことになってしまった様子。(string型だと、ハッシュにして、それぞれの番号を年月日に当てはめていた?)

解決策

db:reset

カラム型を変更すると、既に登録されている生年月日のデータがおかしくなるかなと思って、まずはテーブルのデータを削除しようと思い、以下の記事を見つけた。

①全てのレコードを空にしたい場合はrake db:resetを行う。
rake db:resetは全てのテーブルを dropし、"db/schema.rb"を元にテーブルの再作成を行います。

②"db/migrate/" 以下の全ての migration を実行してテーブルを再作成したい場合は、rake db:migrate:reset
全てのテーブルを dropし"db/migrate/"以下の全ての migration を実行してテーブルを再作成を行うため、こちらの方が効力が強いかと思料されます。

migrationファイルを編集して②やればOKだなと思ったけど、なんか怖かったのでとりあえず①でDBをリセットすると無事に無事に、DB内のデータは全て削除されていた。

データベースをリセット
% rails db:reset

Dropped database 'database名_development'
Dropped database 'database名_test'
Created database 'database名_development'
Created database 'database名_test'

rollback

続いて、カラム型を変更するためにmigrationファイルを修正した。
rails db:rollbackで良いのかなと思ってたけど、既にmigrationファイルが5つあったため、

指定箇所までrollbackする
% rails db:rollback STEP=(num)
# num個前のファイルまでrollbackできる

rollbackして、migrationファイルを修正して

migration
% rails db:migrate

一応確認すると無事に反映されていました。

ちゃんと反映されたかを確認
% rails db:migrate:status

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20200831104449  Devise create users
   up     20200902085108  Create items
   up     20200903070748  Create active storage tablesactive storage
   up     20200907074332  Create orders
   up     20200910081458  Create addresses

無事にカラム型も修正できてエラーも解決できました。