🎅< WEBCAMP ENGINEER COMMUNITY Advent Calendar 2022 23日目の記事です。
背景
大量のテーブルのとあるカラムを全て更新しようと思いました。
ただ、テーブルのupdated_at
が全部更新されてしまうのはちょっと怖いな...と思ったので良いメソッドがないか探したところ、ちょうどよく2種類用意されていたので、ここに簡単にまとめてみます📝
結論
https://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-update_attribute
こちらを読んでいただければ正確にわかります。
せっかくなので一部説明します。
update_attribute(name, value)
Updates a single attribute and saves the record.
This is especially useful for boolean flags on existing records. Also note that
Validation is skipped.
Callbacks are invoked.
updated_at/updated_on column is updated if that column is available.
バリデーションはされず、コールバックは呼ばれ(カラム更新後に何かをするみたいな実装があれば、それを呼んでくれるのだと思います)、updated_at
またはupdated_on
のカラムがあれば更新がされるようです。
今回の期待にはそぐわないですね。
update_columns(attributes)
# 中略
In particular:
Validations are skipped.
Callbacks are skipped.
updated_at/updated_on are not updated.
バリデーションもコールバックもスキップされ、updated_atまたはupdated_onのカラムがあっても更新されないようです。こちらを使用しました。
updated_at
は、データの変化を追う際にキーとなるカラムになり得ます。今回前者のメソッドで実行していただ場合、全てのカラムが同じ時刻になってしまうのでちゃんと探してみて良かったです。