目次
はじめに
Railsでデータベースの構造を変更する際、マイグレーションファイルを使用します。マイグレーションには主に2つの書き方があります:
change
メソッドを使用する方法up
/down
メソッドを使用する方法
この記事では、それぞれの特徴と使い分けについて、具体例を交えて説明します。
changeメソッドとは?
change
メソッドは、Rails 3.1から導入された比較的新しい書き方です。このメソッドの特徴は、マイグレーションの実行(up)とロールバック(down)を自動的に処理してくれることです。
具体例:カラム追加のケース
class AddColumnDispensedGroupIdToPrescriptionHeaders < ActiveRecord::Migration[7.0] def change add_column :prescription_headers, :dispensed_group_id, :string, after: :started_audit_at end end
このコードでは: - マイグレーション実行時(up):指定されたカラムが追加されます - ロールバック時(down):自動的にカラムが削除されます
up/downメソッドとは?
up
とdown
メソッドは、マイグレーションの実行とロールバックの処理を明示的に記述する方法です。
同じ処理をup/downで書いた場合
class AddColumnDispensedGroupIdToPrescriptionHeaders < ActiveRecord::Migration[7.0] def up add_column :prescription_headers, :dispensed_group_id, :string, after: :started_audit_at end def down remove_column :prescription_headers, :dispensed_group_id end end
いつchangeメソッドを使うべきか?
以下のような単純な操作の場合、change
メソッドを使用することをお勧めします:
✅ changeメソッドで対応可能な操作: - カラムの追加/削除 - テーブルの作成/削除 - インデックスの追加/削除 - 参照キーの追加/削除
これらの操作は「可逆的」で、Railsが自動的にロールバック方法を理解できます。
いつup/downメソッドを使うべきか?
以下のような複雑な操作の場合は、up
/down
メソッドを使用する必要があります:
⚠️ up/downメソッドが必要なケース: 1. データの変更を含む操作 ```ruby def upå User.where(role: nil).update_all(role: 'member') end
def down User.where(role: 'member').update_all(role: nil) end ```
複雑なテーブル構造の変更
ruby def up rename_column :users, :name, :first_name add_column :users, :last_name, :string User.all.each do |user| name_parts = user.first_name.split(' ') user.update( first_name: name_parts[0], last_name: name_parts[1] ) end end
可逆的でない操作を含む場合
頻出!可逆的でない操作の具体例
ケース1: カラムの削除
# ❌ Bad: changeメソッドの場合 def change remove_column :users, :birth_date end # ✅ Good: up/downメソッドの場合 def up remove_column :users, :birth_date end def down add_column :users, :birth_date, :date # データ型の指定が必要! end
なぜup/downが必要? - データ型の変更によってデータが失われる可能性がある - ロールバック時の挙動を明確に制御したい
ベストプラクティス
- 基本的には
change
メソッドを使用する - 複雑な変更や、データの更新が必要な場合は
up
/down
メソッドを使用する down
メソッドを書く場合は、必ずup
の逆の操作を正確に記述する- カラムの削除や型の変更時は特に注意が必要
まとめ
- 単純なスキーマ変更 →
change
メソッド - 複雑な変更やデータ操作を含む場合 →
up
/down
メソッド - カラムの削除や型の変更は要注意!
この使い分けを覚えておくことで、より保守性の高いマイグレーションを書くことができます。