1. はじめに:テーブル設計の「やり直し」問題
こんにちは!Railsで開発を始めたばかりだと、テーブル(データの入れ物)の設計を途中で変更したくなりますよね。
今回、私が困ったのはこの状況です。
-
起こったこと:
postsテーブルを作るための設計図(マイグレーションファイル)を作って実行した後に、「あ、このカラム(項目)も必要だった!」と設計図を直しました。 -
期待した結果:
rails db:migrateをもう一度実行すれば、直した内容がデータベース(データ保存場所)に反映されるはずだと思っていました。 - 実際の結果: 何も起こらない! 実行ログも出ないし、テーブルの項目も変わっていませんでした。
🚨 結論!
一度実行して「OK」となった設計図(マイグレーションファイル)は、後から編集しても Railsには無視されてしまいます。
2. なぜ変更が無視されるのか?(Railsの「チェックリスト」の話)
どうして、せっかく直した設計図が無視されてしまうのでしょうか?それは、Railsがデータベースで使っている 「実行済みチェックリスト」 が原因です。
🏠 【例え話】家の工事と設計図
Railsのマイグレーションを、家を建てる時の作業に例えてみましょう。
| 要素 | Railsでの名前 | 役割 |
|---|---|---|
| 設計図 | マイグレーションファイル | テーブルの作り方を書いたファイル |
| 設計図番号 | タイムスタンプ(20251212...) |
設計図を識別する固有の番号 |
| 家(建物) | データベース | 実際にデータが保存されている場所 |
| チェックリスト |
schema_migrations テーブル |
「どの設計図番号の工事が完了したか」を記録 |
仕組み
- あなたが最初に
rails db:migrateを実行しました。 - Railsは設計図番号「
20251212072223」の工事を行い、postsテーブルを作成しました。 - 工事が終わると、**「チェックリスト」**にこの番号を「実行済み(up)」として記録します。
❌ 編集後の再実行が無視される理由
あなたが設計図を修正した後、再度 rails db:migrate を実行しても、Railsは最初にこの「チェックリスト」を確認します。
- 「あれ? 設計図番号
20251212072223は、もうリストに載っていてup(完了) になっているぞ。じゃあ、やることはないな。」
このように判断されるため、どんなに設計図の中身を直しても、Railsはそれを開いてくれないのです。
3. 解決策:「ロールバック」でチェックリストを消す!
変更を反映させるには、「一度実行済みマークを消し、設計図を未実行状態に戻す」必要があります。これを行うのが ロールバック(Rollback) という機能です。
🛠️ 手順
ステップ 1: ロールバックで「やり直し」を宣言する
ロールバックは、直前の migrate でやったことを取り消す命令です。
rails db:rollback
【何が起こるか】
- データベースから、作成済みの
postsテーブルが一時的に削除されます。 - 「チェックリスト」から、設計図番号
20251212072223の「実行済みマーク」が削除されます(down状態に戻ります)。
ステップ 2: 修正後の設計図で再実行する
ロールバックが完了したら、修正済みのマイグレーションファイルの内容で、もう一度 migrate を実行します。
rails db:migrate
【何が起こるか】
- 今回はチェックリストに番号がないので、Railsは設計図を開き、新しい内容(
locationやtextカラムを含む)でテーブルを作り直します。 - 期待していた実行ログが表示されます!
4. 【上級テクニック】実行済みファイルを直さないのが基本!
今回は急いでいたため設計図を直しましたが、今後の開発でトラブルを避けるために、覚えておいてほしい原則があります。
原則:一度実行したマイグレーションファイル(設計図)は触らない!
テーブルに項目を追加したり、変更したりしたい場合は、新しいマイグレーションファイルを常に作りましょう。
🆕 新しい項目を追加したい場合
-
新しいマイグレーションファイルを作成:
# 例:postsテーブルに「title」という項目を追加する rails generate migration AddTitleToPosts title:string -
新しいファイルで実行:
rails db:migrate # 新しいファイルの実行ログだけが表示される
この方法なら、「チェックリスト」に新しい番号が追加されるだけで、過去のファイルは触らなくて済むため、安全です。
この記事が、あなたの開発の助けになれば嬉しいです!


