🦔

Railsの`update_column`と`update`:性能と使い方の違い

2023/08/28に公開

Ruby on Railsの開発を進めていると、モデルの属性を更新する方法としてupdate_columnupdateが使われることがあります。しかし、これらのメソッドの違いを正確に理解していないと、意図しない動作になる可能性があります。この記事では、これらのメソッドの性能や使い方の違いを具体的なコードとともに解説します。

update_column

  • バリデーションをスキップ
  • コールバックをトリガーしない
  • updated_at タイムスタンプは更新されない
user = User.find(1)
user.update_column(:name, "新しい名前")

上記のコードでは、ユーザーの名前が"新しい名前"に直接更新されます。バリデーションやコールバックは実行されず、updated_atも変更されません。

update

  • バリデーションを実行
  • 関連するコールバックをトリガー
  • updated_at タイムスタンプが更新される
user = User.find(1)
user.update(name: "新しい名前")

上記のコードでは、ユーザーの名前が"新しい名前"に更新されますが、このときモデルに定義されたバリデーションやコールバックが実行され、updated_atも更新されます。

まとめ

  • update_columnは直接的なSQL更新を行い、高速ですが、バリデーションやコールバックをスキップするため注意が必要です。
  • updateはバリデーションやコールバックを実行するため、その分遅くなる可能性がありますが、データの整合性を保つことができます。

開発中にどちらのメソッドを使用するかは、アプリケーションの要件や状況に応じて適切に選択することが大切です。

Discussion