Rails の touch 時に処理をフックする
任意のレコードの updated_at のみを更新する際に ActiveRecord の #touch を使うことはあると思います。
class User < ActiveRecord::Base end user = User.create(name: "Homu") pp user.updated_at.iso8601(10) # => "2019-02-18T12:36:37.2315494900Z" # updated_at のみを更新する user.touch pp user.updated_at.iso8601(10) # => "2019-02-18T12:36:37.2315494900Z"
#touch 時に処理をフックする
#touch がやっていることは『updated_at の更新』なので after_save 等でフックしたくなるんですが残念ながら #touch 時には after_save は呼ばれません。
class User < ActiveRecord::Base # #touch 時に after_save は呼ばれない after_save { pp "after_save" } end
#touch 時に処理をフックする場合は after_touch を使用します。
class User < ActiveRecord::Base # touch で更新した後に after_touch が呼ばれる after_touch { pp "after_save" pp updated_at.iso8601(10) } end user = User.create(name: "Homu") pp user.updated_at.iso8601(10) user.touch pp user.updated_at.iso8601(10) # output: # "2019-02-18T12:40:49.6699328380Z" # "after_save" # "2019-02-18T12:40:49.6741588740Z" # "2019-02-18T12:40:49.6741588740Z"
#touch がやっていることは更新なので after_save が呼ばれて当然と思っていてハマりました。
#touch 時には、
after_touchafter_commitafter_rollback
のみが呼ばれます。