ume

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

結論

特定の理由がない限りupdateメソッドを活用しよう。

update_column

  • バリデーションをスキップ

  • コールバックをトリガーしない

  • updated_at タイムスタンプは更新されない

user = User.find(1)
user.update_column(:name, "KOnaN")

もし上記のコードでUserテーブルのnameカラムを更新した場合以下の点に気をつける必要がある。

  • もしnameカラムに「nameカラムは6文字以内しか登録できないなどのバリデーション」を設定している場合でも6文字以上でも登録できてしまう

  • nameカラムには小文字のアルファベットしか登録できないように コールバック(大文字を小文字に変換)を設定してもコールバックが呼び出せない

update

  • バリデーションを実行

  • 関連するコールバックをトリガー

  • updated_at タイムスタンプが更新される

user = User.find(1)
user.update_column(:name, "KOnaN")

update_columnでできないことができる。

まとめ

  • update_columnは直接的なSQL更新を行い、高速ですが、バリデーションやコールバックをスキップするため注意が必要です。

  • updateはバリデーションやコールバックを実行するため、その分遅くなる可能性がありますが、データの整合性を保つことができます。