Railsのmigrationファイルの間違いに気づき、編集して再適用しようとしたけど、うまく適用できないということはないでしょうか。
本記事は、Rails初心者向けに適用済みのmigrationファイルを変更する手順について説明します。
この記事を読むと適用済みのmigrationファイルを変更する方法を学べます。編集してはいけない理由や問題点、マイグレーションファイルのバージョン管理についても説明します。
適用済みmigrationファイルを編集してはいけない
まず、適用済みのmigrationファイルを編集してはいけない理由を説明します。
rails db:migrateコマンドによるデータベースのマイグレーションは未適用のファイルのみ実行します。

例えば2つmigrationファイルが適用された状態で3つ目のmigrationファイルを作成したとします。 このとき、最初の2つのファイルは既に適用済みなのでrails db:migrateコマンドでは3つ目のmigrationファイルのみを実行します。
そうしないとrails db:migrateコマンドを実行するたびに既存のmigrationファイルが何度も実行されることになり、整合性が合わなくなるためです。
適用済みのmigrationファイルは編集しないようにしましょう。
適用済みmigrationファイルの変更手順
適用済みmigrationファイルを変更する手順を以下に示します。
- rails db:migrate:statusコマンドで適用状況を確認する(upとdownの確認)
- rails db:rollbackコマンドで編集したいmigrationファイルが未適用状態(down)となるまで戻す
- migrationファイルを編集する
- rails db:migrateコマンドで再適用する
以降で説明していきます。
マイグレーションファイルのバージョン管理
マイグレーションファイル名には意味があり、バージョン_クラス名.rbという命名規則があります。

ファイル名の昇順でmigrationファイルが適用される
rails db:migrateコマンドではmigrationファイルのファイル名の昇順で実行される決まりとなっています。

そのためファイル名(バージョン_クラス名.rb)のバージョンの部分は新しいファイルのほうが大きな数字となるように作成していきます。
自動生成される場合のバージョンはタイムスタンプ
rails generateコマンドでmigrationファイルを作成する場合は自動的にファイル名が決まります。
このときバージョン部分はタイムスタンプとなります。
例えば 20230224140052_create_posts.rb
のようになります。この場合は2023年2月24日14時00分53秒(UTC)に作成されたためこのバージョンとなっています。
手動でmigrationファイルを作成する場合もバージョンはタイムスタンプとする
migrationファイルのファイル名(バージョン_クラス名.rb)のバージョンの部分は適用順に並ぶようにすれば何でも構いません。 しかしrails generateコマンドで作成されたときはタイムスタンプになるので、手動で作成する場合でもタイムスタンプとしておくのが無難です。
Railsの昔のバージョンではただの連番とすることもありました。 たとえばRailsで作られた案件管理システムであるRedmineのマイグレーションファイル名を見てみると、古いファイルは3桁の連番となっています。 しかし、途中からタイムスタンプになりました。

redmine/db/migrate at master · redmine/redmine
rails generateコマンドに頼らず自分で作成する場合でも年月日時分秒となるようにファイル名をつけましょう。
rails db:migrate:statusの読み方
rails db:migrate:statusコマンドの実行結果の読み方を解説します。
例えば以下のような結果となります。
Status Migration ID Migration Name
--------------------------------------------------
up 20230219145701 Create users
down 20230224140052 Create posts
各列の意味は以下の通りです。
列名 | 説明 |
---|---|
Status | migrationファイルの適用状況。upは適用済み、downは未適用を表す。 |
Migration ID | migrationファイルのID。 ファイル名(バージョン_クラス名.rb)のバージョンの部分。 |
Migration Name | migrationファイルの名前。 ファイル名(バージョン_クラス名.rb)のクラス名の部分。 |
上記の出力例であれば以下のように読み取れます。
up 20230219145701 Create users
の行は20230219145701_create_users.rbが適用済みdown 20230224140052 Create posts
の行は20230224140052_crate_posts.rbが未適用
注意点:他の開発者と共有済みのmigrationファイルを変更する場合
Gitでコミット/プッシュ済みであったり、本番環境に適用済みのmigrationファイルの場合はロールバックしてしまうとデータも消えてしまうため戻せません。
既存のmigrationファイルを編集するのではなく、変更を行う新たなmigrationファイルを追加しましょう。
例えば以下の通りです。
- 間違えたカラム名やデータ型を修正したい場合はカラム名を変更するmigrationファイルを追加
- 間違えたテーブル名を修正したい場合はテーブル名を変更するmigrationファイルを追加
共有済みのmigrationファイルの変更はできないので「変更のためのmigrationファイル」を追加して対応しましょう。
まとめ
この記事では、Railsを使用している場合に適用済みのmigrationファイルを変更する手順について説明しました。また、編集してはいけない理由や問題点、他の開発者と共有済みのmigrationファイルを変更する場合の手順、マイグレーションファイルのバージョン管理についても説明しました。
まずはrails db:migrate:statusコマンドの読み方をマスターすることが大切です。