1. はじめに
Railsアプリの開発において、スキーマに変更がある状態でgitのブランチを切り替える際には注意が必要です。
ブランチを切り替えると、ソースコードは切り替わりますが、データベースのスキーマは変更されません。
これはスキーマがブランチを跨いで共有されるためです。
この記事では、マイグレーションを実行してスキーマに変更がある状態でブランチを切り替える際の手順について解説します。
正確な手順を理解することで、意図せぬ不具合の発生を防ぐことができます。
2. 検証環境
- macOS:13.4
- Ruby:3.1.0
- Rails:6.1.4.7
- git:2.39.1
3. 手順
3-1. マイグレーションをロールバックする
まず、現在のブランチを確認します。
$ git branch --contains * feature/1 #現在のブランチ
次に、マイグレーションのステータスを確認します。
$ rails db:migrate:status database: testdb Status Migration ID Migration Name -------------------------------------------------- up 20130305105556 XXXXXX up 20130305105557 XXXXXX up 20130305115750 XXXXXX up 20230313082351 XXXXXX #feature/1で実行したマイグレーション
最下部の20230313082351は現在のブランチ(feature/1)で行ったマイグレーションです。
以下のコマンドを実行して、直近のマイグレーションをロールバックします。
$ rails db:rollback
- 最後に行ったn個のマイグレーションをロールバック→
rails db:rollback STEP=n - 特定のマイグレーションをロールバック→
rails db:migrate:down VERSION=XXXXXXXXXXXXXX
ロールバックできていることを確認します。
$ rails db:migrate:status database: testdb Status Migration ID Migration Name -------------------------------------------------- up 20130305105556 XXXXXX up 20130305105557 XXXXXX up 20130305115750 XXXXXX down 20230313082351 XXXXXX
3-2. db/schame.rbの変更を破棄する
ロールバックを実行すると、db/schema.rbは20230313082351のマイグレーションを行う前の状態に戻されるので、その変更を破棄します。
$ git checkout db/schema.rb
3-3. ブランチを切り替える
ここまでの手順を行うことで、問題なくブランチを切り替えることができます。
$ git checkout feature/2
$ rails db:migrate:status database: testdb Status Migration ID Migration Name -------------------------------------------------- up 20130305105556 XXXXXX up 20130305105557 XXXXXX up 20130305115750 XXXXXX
feature/1で実行した20230313082351がなくなっていることが確認できます。
以上で、マイグレーションを実行してスキーマに変更がある状態でブランチを切り替えることができました。
4. NO FILEのマイグレーションについて
上記の手順を忘れてブランチを切り替えると、NO FILEのマイグレーションができてしまいます。
$ git checkout feature/2 Switched to branch 'feature/2' $ rails db:migrate:status database: testdb Status Migration ID Migration Name -------------------------------------------------- up 20130305105556 XXXXXX up 20130305105557 XXXXXX up 20130305115750 XXXXXX up 20230313082351 ********** NO FILE **********
この状態だと一時的には問題なく作業できますが、後に混乱の元になります。
よくあるのは、この状態に気づかずにfeature/2で新たにマイグレーションファイルを作成してrails db:migrateを実行することです。
すると、db/schema.rbに予期しない変更が加えられてしまいます(NO FILEのマイグレーションの変更が適用されている)。
NO FILEのマイグレーションの修正方法については、以下の記事をご参照ください。
【参考】