こんにちは、かつコーチです。
データベースにテーブルを作りたいとき、SQLを直接書かずに rails generate migration というコマンドを使うと聞いて、戸惑った経験はありませんか。
私も最初は「なぜわざわざファイルを作ってからコマンドを実行するのか」がピンときませんでした。
この記事では、Railsのマイグレーション(データベースの構造を、コードで管理・変更できるようにする仕組みです)の基本を、実際にテーブルを作成する手順に沿って解説します。
読み終えるころには、テーブルの作成・変更を自分の手で行えるようになっているはずです。
マイグレーションとは?
なぜコードでテーブルを管理するのか
データベースのテーブル構造を、SQLで直接いじってしまうと、以下のような問題が起きます。
- 誰がいつ何を変更したのか記録が残らない
- チームメンバーの環境と本番環境で構造がズレる
- 変更を元に戻すのが難しい
Railsのマイグレーションは、テーブルの変更内容をRubyのコードとして残すことで、この問題を解決します。
変更履歴がファイルとして残るので、Gitで管理でき、チーム全員が同じ手順でデータベースを更新できます。
マイグレーションファイルとschema.rb
マイグレーションを実行すると、その結果は db/schema.rb というファイルに反映されます。
このファイルを見れば、現在のデータベース構造がひと目でわかります。
つまりマイグレーションファイルが「変更の履歴」、schema.rb が「現在の完成形」という役割分担です。
rails generate migrationの使い方
手順1:マイグレーションファイルを生成する
投稿を管理する posts テーブルを作る例で見ていきましょう。
$ bin/rails generate migration CreatePosts title:string body:text published:boolean
Create + テーブル名(複数形) という名前にすると、Railsが自動でテーブル作成用のコードを組み立ててくれます。
生成されるファイルは以下のようになります。
# db/migrate/20260822010000_create_posts.rb
class CreatePosts < ActiveRecord::Migration[8.0]
def change
create_table :posts do |t|
t.string :title
t.text :body
t.boolean :published, default: false
t.timestamps
end
end
end
t.timestamps は created_at と updated_at の2カラムを自動で追加してくれる便利な記法です。
レコードがいつ作られ、いつ更新されたかを自動で記録してくれます。
手順2:changeメソッドを理解する
マイグレーションファイルの中心は change メソッドです。
change メソッドの中に「どう変更したいか」を1方向だけ書けば、Railsが自動で逆方向の変更(ロールバック)も理解してくれます。
例えば create_table と書けば、ロールバック時には自動で drop_table が実行されます。
代表的な操作をまとめると、以下のとおりです。
| メソッド | 役割 |
|---|---|
create_table | テーブルを新規作成する |
add_column | カラムを追加する |
remove_column | カラムを削除する |
change_column | カラムの型・設定を変更する |
add_index | インデックスを追加する |
rename_column | カラム名を変更する |
手順3:rails db:migrateを実行する
マイグレーションファイルを作っただけでは、まだデータベースには反映されていません。
以下のコマンドで実行します。
$ bin/rails db:migrate
実行すると、ターミナルに以下のような出力が表示されます。
== 20260822010000 CreatePosts: migrating ====================================
-- create_table(:posts)
-> 0.0043s
== 20260822010000 CreatePosts: migrated (0.0044s) ============================
これで posts テーブルが作成され、db/schema.rb にも反映されます。
手順4:既存テーブルにカラムを追加する
すでにあるテーブルにカラムを追加したい場合は、Add + カラム名 + To + テーブル名 という命名にすると、追加用のコードが自動生成されます。
$ bin/rails generate migration AddViewCountToPosts view_count:integer
# db/migrate/20260822020000_add_view_count_to_posts.rb
class AddViewCountToPosts < ActiveRecord::Migration[8.0]
def change
add_column :posts, :view_count, :integer, default: 0
end
end
同じように bin/rails db:migrate を実行すれば反映されます。
よくあるつまずきポイント・エラー対処
マイグレーションファイルを直接編集して実行しても反映されない
私が実際にハマったパターンです。
一度 db:migrate を実行済みのファイルを直接書き換えて、もう一度 db:migrate を実行しても、データベースには何も変化がありませんでした。
❌ Before:実行済みのマイグレーションファイルを直接書き換える
# db/migrate/20260822010000_create_posts.rb(すでにmigrate済み)
class CreatePosts < ActiveRecord::Migration[8.0]
def change
create_table :posts do |t|
t.string :title
t.text :body
# 後からsummaryカラムを直接ここに追記してしまった
t.string :summary
t.timestamps
end
end
end
Railsは「どのマイグレーションを実行済みか」をバージョン番号で管理しています。
すでに実行済みのファイルを書き換えても、Railsはそれを「実行不要」と判断してスキップしてしまうのです。
✅ After:新しいマイグレーションファイルを追加する
$ bin/rails generate migration AddSummaryToPosts summary:string
# db/migrate/20260822030000_add_summary_to_posts.rb
class AddSummaryToPosts < ActiveRecord::Migration[8.0]
def change
add_column :posts, :summary, :string
end
end
「一度実行したマイグレーションファイルは、原則として編集せず、変更は新しいファイルで行う」というルールを徹底しましょう。
PendingMigrationError でアプリが起動しない
マイグレーションファイルを作っただけで db:migrate を忘れると、以下のエラーで画面が真っ白になります。
ActiveRecord::PendingMigrationError
Migrations are pending. To resolve this issue, run:
bin/rails db:migrate RAILS_ENV=development
❌ Before:generateしただけでmigrateを忘れる
$ bin/rails generate migration CreatePosts title:string body:text
# ここでdb:migrateを実行せずにサーバーを起動してしまう
$ bin/rails server
✅ After:generate直後に必ずdb:migrateを実行する
$ bin/rails generate migration CreatePosts title:string body:text
$ bin/rails db:migrate
$ bin/rails server
エラーメッセージ自体に解決コマンドが書かれているので、慌てずにそのまま実行すれば解決します。
まとめ
この記事のポイント
- マイグレーションは、データベースの変更履歴をコードとして管理する仕組み
rails generate migration Createテーブル名でテーブル作成用のファイルを生成できるchangeメソッドに1方向の変更を書けば、ロールバックも自動で対応してくれるrails db:migrateを実行して初めてデータベースに反映される- 実行済みのマイグレーションファイルは編集せず、新しいファイルで変更を加える
次に読むべき記事
- ActiveRecordの基本:モデルとCRUD操作
- バリデーションの基本
タグ: Ruby on Rails, 初心者向け, データベース