0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Rails】DB上の属性をアップデートするメソッド

0
Posted at

はじめに

こんにちは。アメリカに住みながら独学でエンジニアを目指している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_updateafter_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のバージョンによって非推奨になっているメソッドもあるため、常に最新のガイドやリリースノートを確認しながらメソッドを選択していくと良いでしょう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?