カテゴリ: Rails 更新日: 2026/01/13

Railsマイグレーション完全保存版|change・up・down・reversibleで安全にスキーマ変更する方法

change/up/down/reversible:安全なスキーマ変更の書き方【保存版】
change/up/down/reversible:安全なスキーマ変更の書き方【保存版】

先生と生徒の会話形式で理解しよう

生徒

「マイグレーションを書いていると、changeだけでいいのか、upやdownを書くべきなのか分からなくなります…」

先生

「それぞれ役割が違います。使い分けを知ると、スキーマ変更がずっと安全になりますよ」

生徒

「reversibleっていうのも見かけました。正直、名前だけで混乱しています」

先生

「大丈夫です。日常生活の例に置き換えると、とてもシンプルです」

1. マイグレーションにおける「安全」とは何か

1. マイグレーションにおける「安全」とは何か
1. マイグレーションにおける「安全」とは何か

Railsのマイグレーションで大切なのは、 元に戻せることです。 テーブルやカラムの変更は、 一度失敗するとデータが壊れる可能性があります。

例えるなら、部屋の模様替えです。 家具を動かしても、 元の位置に戻せるなら安心ですよね。 マイグレーションも同じで、 「戻せる設計」が安全なスキーマ変更につながります。

2. changeメソッドとは?一番よく使われる基本形

2. changeメソッドとは?一番よく使われる基本形
2. changeメソッドとは?一番よく使われる基本形

changeは、 Railsが自動で「元に戻す方法」を 判断できる場合に使える書き方です。 初心者が最初に覚えるのは、このchangeです。


class AddAgeToUsers < ActiveRecord::Migration[7.0]
  def change
    add_column :users, :age, :integer
  end
end

この場合、 カラムを追加する操作は Railsが自動で「削除」に戻せるため、 changeだけで問題ありません。

3. changeが使えないケースがある理由

3. changeが使えないケースがある理由
3. changeが使えないケースがある理由

すべての変更が、 自動で元に戻せるわけではありません。 データの変換や複雑な操作は、 Railsが判断できない場合があります。

これは料理で言うと、 「材料を切る」だけなら元に戻せませんよね。 そういった場合は、 手動で戻し方を書く必要があります。

4. upとdownとは?戻り道を自分で書く方法

4. upとdownとは?戻り道を自分で書く方法
4. upとdownとは?戻り道を自分で書く方法

upとdownは、 「進む処理」と「戻る処理」を 明示的に書く方法です。 Railsに任せず、 開発者が責任を持って定義します。


class ChangePriceType < ActiveRecord::Migration[7.0]
  def up
    change_column :products, :price, :integer
  end

  def down
    change_column :products, :price, :string
  end
end

upが「前に進む道」、 downが「元に戻る道」です。 一本道ではなく、 必ず往復できる道を用意する意識が重要です。

5. up/downが必要になる典型的な場面

5. up/downが必要になる典型的な場面
5. up/downが必要になる典型的な場面

カラムの型変更、 データの一括変換、 SQLを直接書く場合などは、 changeでは不十分なことがあります。

初心者のうちは、 「changeで書けないと感じたらup/down」 と覚えておくと混乱しません。

6. reversibleとは?changeの中で分岐させる書き方

6. reversibleとは?changeの中で分岐させる書き方
6. reversibleとは?changeの中で分岐させる書き方

reversibleは、 changeメソッドの中で upとdownの動きを分けたいときに使います。 一つのメソッド内で、 進む処理と戻る処理を書けます。


def change
  reversible do |dir|
    dir.up do
      execute "UPDATE users SET name = 'unknown' WHERE name IS NULL"
    end

    dir.down do
      execute "UPDATE users SET name = NULL WHERE name = 'unknown'"
    end
  end
end

reversibleは、 一本道に見えるchangeの中に、 分かれ道を作るイメージです。

7. change・up/down・reversibleの使い分け

7. change・up/down・reversibleの使い分け
7. change・up/down・reversibleの使い分け

使い分けの基本はとてもシンプルです。 自動で戻せるならchange、 戻し方を自分で決めたいならup/down、 changeの中で分けたいならreversible。

最初から完璧を目指す必要はありません。 「安全に戻せるか?」を考える習慣が、 マイグレーション設計の第一歩です。

8. 初心者が意識すべき安全なスキーマ変更の考え方

8. 初心者が意識すべき安全なスキーマ変更の考え方
8. 初心者が意識すべき安全なスキーマ変更の考え方

マイグレーションは、 チーム全員で共有する履歴です。 自分だけでなく、 将来の自分や他の人が 安心して実行できることが大切です。

change・up・down・reversibleを理解すると、 スキーマ変更は怖い作業ではなくなります。 「戻れる設計」を意識することが、 Rails開発を長く支える基礎になります。

カテゴリの一覧へ
新着記事
New1
データベース
SQLの処理が遅くなる原因とは?初心者向けにデータベースパフォーマンス最適化を完全解説
New2
Ruby
RubyのネストHash操作を徹底解説!digとtransformメソッドで複雑なデータも楽々
New3
Rails
Railsインデックス設計の極意!爆速サイトを作るためのスキーマ設計ガイド
New4
データベース
SQLのCOMMITとROLLBACKとは?トランザクション操作を初心者向けに完全解説
人気記事
No.1
Java&Spring記事人気No1
Ruby
PATHと環境変数の正しい設定!Windows・Mac・Linux別チェックリスト付き
No.2
Java&Spring記事人気No2
Rails
Railsで日本語と時刻の設定をしよう!初心者でも安心のlocale/zone初期設定チートシート
No.3
Java&Spring記事人気No3
Ruby
Rubyのハッシュを徹底比較!シンボルキーと文字列キーの違いと使い分け
No.4
Java&Spring記事人気No4
Rails
Railsマイグレーションの型選びを完全ガイド!初心者が迷わないカラム設計
No.5
Java&Spring記事人気No5
Ruby
WindowsでRubyをインストールする方法!RubyInstallerとMSYS2を使った完全ガイド
No.6
Java&Spring記事人気No6
Rails
RailsモデルとActive Record基礎|ID戦略を完全理解!AUTO INCREMENT・UUID・ULIDの比較と導入手順
No.7
Java&Spring記事人気No7
データベース
ACID特性とは?データベーストランザクションの信頼性を初心者向けに徹底解説
No.8
Java&Spring記事人気No8
データベース
データベース正規化とは?初心者でもわかるデータ重複を防ぐSQL設計の基本