【Ruby on Rails】マイグレーションの基本:テーブルを作成・変更する

Ruby

こんにちは、かつコーチです。

データベースにテーブルを作りたいとき、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.timestampscreated_atupdated_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, 初心者向け, データベース

タイトルとURLをコピーしました