ActiveRecord::Base#reloadの使い方
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を使ってるのかな?面白い。