前提
本番環境(herokuやfly,AWSなど)とローカル環境(自分のパソコン内)ではマイグレーションが最初から行われて、別々のDBが作成されます
よって、ローカルではうまく行っている場合でも本番環境ではDBがうまく構築されないことがあります
原因はいくつか考えられますが、
- ローカルのDBにテーブルやカラムを作った後にマイグレーションファイル削除した(本番環境のDBでは、必要なテーブルやカラムが作られていない)
- テーブルがないのにカラムを追加しようとしている
- 同じ名前のカラムを追加しようとしてる
- 作成されてないテーブル、もしくはカラムを削除しようとしている
- ファイル名とクラス名が一致していない
などが挙げられます!
マイグレーションファイルを整理する
本番環境ではマイグレーションファイルを元に1からDBが作成されます
よってマイグレーションファイルを見やすくわかりやすくしてあげる必要があります。
ポイントをまとめます!
- 1マイグレーションファイルに1テーブル
- テーブルとカラムは一度に作成してあげる(カラムだけを追加するマイグレーションファイルは削除する)
- カラムやテーブルを削除するマイグレーションファイルは消す
- 外部キーを使う場合(コメント機能や、いいね機能でアソシエーションしてる場合)は親テーブルを先に作成する。(マイグレーションファイルをリネームすれば順番を変更できます)
- 存在しないカラムやテーブルを操作(追加や削除など)していないか
以上の観点があればマイグレーションファイルをスッキリできると思います!
ローカルでうまく動作するか確認
マイグレーションファイルを整理したら、ローカル上でちゃんとデータベースが構築されるか確認しましょう!
$ rails db:migrate:reset
$ rails db:seed #seedを使ってる場合に実行
うまくいかないでエラーになる場合があるのでその場合はこちらの記事を参考にしてください
ここでサーバーを起動し、エラーが出ないことを確認しましょう
変更したマイグレーションファイルをデプロイ(fly.ioの場合)
$ flyctl deploy
変更したマイグレーションファイルをデプロイ(herokuの場合)
$ git add -A
$ git commit -m "マイグレーションを変更"
$ git push heroku master # もしくは git push heroku main
heroku上でDBリセット、マイグレーション
$ heroku pg:reset DATABASE
#=> アプリ名の入力を求められるので入力
$ heroku run rails db:migrate
$ heroku run rails db:seed #seedを使ってる場合に実行
これでうまくいくと思います!