DBを再構築して、既存の本番環境を更新する

What

表題の通りです。
機能を追加するために、後からDBを修正することがあると思います (初めの設計がよくなかったパターン)。
Railsでの対処法を解説します。

Solution

ローカル

まず、migrationファイルでは扱いづらいため、jalkoby/squasherを使います。
以下の記事で簡単に説明しています。
https://diary-study-by-takuya.hateblo.jp/entry/2020/01/20/225942

現状のmigrationファイルでは、ファイルを作成した順番でTableが作成されるため、外部キーを新たに作りたい場合、不便なことがあります。squasherで集約すると、同一のファイル内でテーブルを生成する順番を簡単に入れ替えることができます。

デプロイしよう

capistranoでデプロイします。
しかし、taskを設定していない場合、以下は実行されません。

$ rails db:migrate:reset

ただ、taskを設定して、デプロイ時に毎回実行されるのも不便です。capistrano-rails-collectionとかもありますが、インスタンスに入って直接railsコマンドを打った方が手間が少ないと感じます。

capistranoを使用している場合は以下のファイルに最新ファイルがあります。

/var/www/<アプリ名>/current/

そこで、以下を実行すれば、dbを再構築できます。

$ RAILS_ENV=production DISABLE_DATABASE_ENVIRONMENT_CHECK=1 rails db:migrate:reset

結果が反映されない場合は、インスタンスを再起動したり、capistranoを実行し直したりすれば、反映されるようになります。