読者です 読者をやめる 読者になる 読者になる

ActiveRecord::Base#reloadの使い方

Rails

ARインスタンスをデータベースから再取得する。

例えば別のリクエストで発生したプロセスがDBのカラムを変更したときに、インスタンスにはもちろん反映されない。

変更されたRDBの内容をインスタンスに反映させるのがこのActiveRecord::Base#reloadというわけ。

@model = Model.find(1) # @model.name => 'RubyKaigi'
Model.find(1).update_column(:name, 'Pycon')
@model.name # =>  # @model.name => 'RubyKaigi'
@model.reload.name => # @model.name => 'Pycon'

といってもreloadというのはオブジェクトの感覚でRDBを扱えるような工夫であるだけで、実施はActiveRecord::Base.findとActiveRecord::Base#reloadは同じSQLを叩いているらしい。

参考: https://teratail.com/questions/2230

[19] pry(main)> @user = User.find(1)
  User Load (0.2ms)  SELECT  "users".* FROM "users"  WHERE "users"."id" = ? LIMIT 1  [["id", 1]]
  
  [20] pry(main)> @user.reload
  User Load (0.2ms)  SELECT  "users".* FROM "users"  WHERE "users"."id" = ? LIMIT 1  [["id", 1]]

あれっ、本当だ。reloadのときのidは、インスタンスのunique keyを使ってるのかな?面白い。