はじめに
バリデーションをスキップするメソッドをまとめます。
update
update_all
- 条件に一致するレコードをすべて更新する
- コールバックもスキップする
- updated_at/updated_onは更新されない
User.pluck(:code)
=> ["100", "200", "300"]
User.pluck(:updated_at)
=> [Wed, 04 Dec 2024 00:00:00.000000000 JST +09:00, Mon, 16 Dec 2024 10:31:50.000000000 JST +09:00, Sat, 31 May 2025 10:12:59.000000000 JST +09:00]
User.update_all(code: 400)
User.pluck(:code)
=> ["400", "400", "400"]
User.pluck(:updated_at)
=> [Wed, 04 Dec 2024 00:00:00.000000000 JST +09:00, Mon, 16 Dec 2024 10:31:50.000000000 JST +09:00, Sat, 31 May 2025 10:12:59.000000000 JST +09:00]
update_attribute / update_attribute!
-
update_attribute(属性名, 値)
で更新する - コールバックはスキップしない
-
updated_at/updated_on
カラムがあれば更新する
u = User.first
u.updated_at
=> Wed, 04 Dec 2024 00:00:00.000000000 JST +09:00
u.name
=> "A"
u.update_attribute(:name, "花子")
u.name
=> "花子"
u.updated_at
=> Sat, 31 May 2025 11:11:18.000000000 JST +09:00
update_column / update_columns
-
update_column(属性名, 値)
、update_columns(属性)
で更新する - コールバックもスキップする
-
updated_at/updated_on
は更新されない
u = User.first
u.updated_at
=> Wed, 04 Dec 2024 00:00:00.000000000 JST +09:00
u.name
=> "A"
u.update_column(:name, "B")
u.name
=> "B"
u.update_columns(name: "C")
u.name
=> "C"
u.updated_at
=> Wed, 04 Dec 2024 00:00:00.000000000 JST +09:00
その他
increment! / decrement!
- カウントアップ / カウントダウン
e = Event.first
e.day
=> 5
e.increment!(:day, 2)
e.day
=> 7
e.decrement!(:day, 3)
e.day
=> 4
toggle!
- 属性の反対のブール値を割り当てる
u.deleted
=> false
u.toggle!(:deleted)
u.deleted
=> true
touch
-
update_at
カラム を現在の時刻に更新する - 時刻を引数で指定すると、指定した時刻に更新できる
u = User.first
u.updated_at
=> Wed, 04 Dec 2024 11:47:50.000000000 JST +09:00
u.touch
u.updated_at
=> Sat, 31 May 2025 10:26:20.000000000 JST +09:00
u.touch(time: Time.new(2025,5,1,0,0,0))
u.updated_at
=> Thu, 01 May 2025 00:00:00.000000000 JST +09:00
save(validate: false)
- オブジェクトを保存する
u = User.first
u.code
=> "100"
u.updated_at
=> Wed, 04 Dec 2024 00:00:00.000000000 JST +09:00
u.code = "200"
u.save(validate: false)
User.first.code
=> "200"
u.updated_at
=> Sat, 31 May 2025 11:28:44.000000000 JST +09:00
おわりに
有効無効に関わらずオブジェクトが保存されてしまうので、使用の際は十分に注意する必要があります。