はじめに
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つあったため、
% rails db:rollback STEP=(num)
# num個前のファイルまでrollbackできる
rollbackして、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
無事にカラム型も修正できてエラーも解決できました。