はじめに
こんにちは。アメリカに住みながら独学でエンジニアを目指しているTairaです。
RailsのActive Recordでは、モデルの属性を更新するために様々なメソッドが用意されています。
ここでは、代表的なメソッドであるupdate, update_attribute, update_columnsをピックアップし、それぞれの特徴や利用シーンを整理してみましょう。
1. update
概要
- Railsでよく使用されるアップデートメソッドの一つで、レコードの一部または複数の属性を一括で更新します。
- 更新後は、モデルインスタンスのバリデーションを実行し、不正な値の場合は更新がキャンセルされます。
使用例
@user = User.find(1)
@user.update(name: "Alice", age: 30)
ポイント
- バリデーションが走る。
- 更新時にコールバックが呼び出される。
- 更新成功時に
true、失敗時にfalseを返す。
2. update_attribute
概要
- 一つの属性を更新するためのメソッドです。
- バリデーションが実行されず、コールバックは
before_updateとafter_updateのみが呼ばれます。 - DBのカラムを直接更新する動作に近く、特定の制約を無視してでも更新したい場合に使われることがあります。
使用例
@user = User.find(1)
@user.update_attribute(:name, "Bob")
ポイント
- バリデーションが実行されないので注意が必要。
- 一つのカラムのみ更新できる。
-
save(validate: false)に近い動きをするが、コールバックは実行される。
3. update_columns
概要
- バリデーションやコールバック、タイムスタンプの更新を一切行わずに、指定したカラムだけを直接更新します。
- DBのコラムに直接SQLを発行するようなイメージです。
- 大量レコードの更新や、高パフォーマンスが必要な場面で役立つケースがありますが、注意点も多くあります。
使用例
@user = User.find(1)
@user.update_columns(name: "David", updated_at: Time.current)
ポイント
- バリデーションを行わない。
- コールバックは呼ばれない。
-
updated_atなどのタイムスタンプが自動更新されないため、明示的に指定が必要。 - コードの保守性や整合性を損なうリスクがあるため、使用時は十分注意。
まとめ
| メソッド | バリデーション | コールバック | 複数属性 | タイムスタンプ自動更新 | 代表的な使い所 |
|---|---|---|---|---|---|
update |
あり | すべて呼ばれる | 可能 | あり | 標準的な更新。モデルのバリデーションを尊重したい場合に。 |
update_attribute |
なし | update系コールバックのみ | 単一属性 | あり (対象属性がタイムスタンプであれば) | バリデーションを無視して特定の1属性のみ更新したい場合に(ただし注意)。 |
update_columns |
なし | 呼ばれない | 可能 | なし | 直接DBカラムを更新したい場合。大量更新やパフォーマンス重視。 |
バリデーションやコールバックの要否、どの程度フレームワークの恩恵を受けたいかによって使い分けると良いでしょう。通常はupdateを使用し、どうしてもバリデーションを無視したい場合にはupdate_attribute、高パフォーマンスが求められる際やコールバックを走らせたくない時にはupdate_columnsを選択する、という使い分けを意識してみてください。
以上がupdate, update_attribute, update_columnsの基本的な使い方や違いです。Railsのバージョンによって非推奨になっているメソッドもあるため、常に最新のガイドやリリースノートを確認しながらメソッドを選択していくと良いでしょう。