テーブルの変更内容がRenderに反映しない時の対処方法

# 使用しているツール・動作環境
・アプリケーション制作の主要言語：Ruby
・本番環境のデータベース：TablePlus
・本番環境：Render

# テーブルの変更内容がRenderに反映されない原因
マイグレーションファイルの作成が正しく行われていない場合、
Renderで作成したテーブルの構成を変更できないことがあるようです。

以下の条件に当てはまる場合の対処法の共有です。

:::note info
確認事項
カラムの変更などのテーブル変更を行なった
ローカルでは変更内容が正しく反映する
Renderでデプロイを行なった際、エラーは出ないがテーブルに変更内容が反映されない
:::


# Renderで作成したデータベースをリセットする

:::note warn
警告
以下作業を行うと、**過去の投稿データすべてが削除**されます。
それでも問題がない場合は実行OKです
:::

## 1. デプロイ時に自動で実行される処理内容を変更する
８行目をコメントアウトし、９行目（データベースをリセットするために必要な記述）を追記。
```ruby
#!/usr/bin/env bash
# exit on error
set -o errexit

bundle install
bundle exec rake assets:precompile
bundle exec rake assets:clean
# bundle exec rake db:migrate
DISABLE_DATABASE_ENVIRONMENT_CHECK=1 bundle exec rake db:migrate:reset
```

`bundle exec rake db:migrate`とは
bundle exec rake db:migrateというコマンドは、Railsのフレームワークで用いられるコマンドで、アプリケーションのデータベーススキーマを更新するためのもの。

`DISABLE_DATABASE_ENVIRONMENT_CHECK=1　`とは
本番環境のデータベースを削除するために必要な設定。
本番用のデータベースは重要な情報が含まれるので、普段は削除できないようになっているが、
今回はリセットをしたいので、削除を許可する設定を記述。

`bundle exec rake db:migrate:reset`とは
データをリセットするためのコマンド。
以下の三つのコマンドを順番に実行する動作をする。
・rake db:drop(データベースの削除)
・rake db:create(データベースの作成)
・rake db:migrate（マイグレーションファイルの実行）


## 2. TablePlusを開いている場合は終了する
これからリセットを実行するので、データベースをTablePlusで開いている場合削除できないから

## 3. GitHubにプッシュ
コードの変更内容をプッシュして更新する。
プッシュすると、Renderのデプロイが実行される。

## 4. 動作確認を行う
本番環境で操作したり、TablePlusのテーブル内容が反映されているか確認する。

## 5. 設定を元に戻す
手順１で追記したコードにより、現状だと`デプロイのたびにデータベースをリセットする設定`になってしまっているので設定を初期値に戻す。
```ruby
#!/usr/bin/env bash
# exit on error
set -o errexit

bundle install
bundle exec rake assets:precompile
bundle exec rake assets:clean
bundle exec rake db:migrate

```


以上です。
なんとかデータベースをクリアして、正常にテーブルの変更内容を本番環境のデータベース側に反映させることができました。



### 以下、ちょっとした失敗談。
私の場合、`手順1`をした上で、`データベースリセット`のための`3つのコマンド`を実行しました。
コマンドを一つずつ実行す手間を省くための`手順1`の記述でしたが、気づけば
自らコマンドを打ち込んでおりました。
自分の手間が増えるだけで、作業には問題はないはず。
指を鍛える運動だ！！と思って前向きに捉えていたのですが、
その際、出現したエラーがこちら
```
% rake db:drop
rake aborted!
Gem::LoadError: You have already activated rake 13.2.1, but your Gemfile requires rake 13.2.0. Prepending `bundle exec` to your command may solve this. (Gem::LoadError)
<internal:/Users/riko/.rbenv/versions/3.2.0/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
<internal:/Users/riko/.rbenv/versions/3.2.0/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
/Users/riko/projects/presentbox/config/boot.rb:3:in `<top (required)>'
/Users/riko/projects/presentbox/config/application.rb:1:in `require_relative'
/Users/riko/projects/presentbox/config/application.rb:1:in `<top (required)>'
/Users/riko/projects/presentbox/Rakefile:4:in `require_relative'
/Users/riko/projects/presentbox/Rakefile:4:in `<top (required)>'
/Users/riko/.local/share/gem/ruby/3.2.0/gems/rake-13.2.1/exe/rake:27:in `<top (required)>'
(See full trace by running task with --trace)
```

調べてみると、`システムはrake 13.2.1を有効化していますが、Gemfileではrake 13.2.0を要求している`ということのようです。
システムで有効化しているバージョンとGemfileで要求している**rakaのバージョンが一致していないことによるエラー**でした。

対処方法は確認すると**２パターン**あり、
`パターン1`を試して、それでもうまくいかない場合は`パターン２`を試してみることがよさそうです。
結果として、`パターン2`を実行することになりましたが、正常に稼働したので良かったなと思っています:relaxed:

### パターン1　Gemfile側Rakeのバージョンをそのまま使う
```shell
bundle exec rake db:drop
```
`上記のコマンドを実行`する
bundle execを利用することで、アプリケーション（つまり、自分のプロジェクトのGemfile）が指定したバージョンのgemを利用することができる

### パターン２　Gemfile側のRakaのバージョンをアップデートする
```
bundle update rake
```
`上記コマンドを実行`する。
rake gemの新しいバージョンをインストールし、その後、Gemfile.lock ファイルが更新され、新しいバージョンへとリファレンスが更新される。
ただし、***これにより他の依存関係に影響を及ぼす可能性がある***ため、***更新前後でアプリケーションが正常に動作するか確認***が必要。