あまブログ

ドキドキ......ドキドキ2択クイ〜〜〜〜〜〜〜ズ!!

【Rails】マイグレーション実行後のブランチ切り替えにおける注意点

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.rb20230313082351のマイグレーションを行う前の状態に戻されるので、その変更を破棄します。

$ 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のマイグレーションの修正方法については、以下の記事をご参照ください。

ama-tech.hatenablog.com


【参考】