レビューしている時に touch
メソッド使って current_sign_in_at
とかを力技で更新をしているのをみてもっと良い方法がないかと調べて見つけたのでメモに残す。
結論としては Devise::Models::Trackable
モジュールの #update_track_fields!
を使えば良い。
リポジトリを In this repository
検索して出てきたコードを読んで見つけたので何かで使ったときは同じ手法を使ってみたい。
def update_tracked_fields(request) old_current, new_current = self.current_sign_in_at, Time.now.utc self.last_sign_in_at = old_current || new_current self.current_sign_in_at = new_current old_current, new_current = self.current_sign_in_ip, extract_ip_from(request) self.last_sign_in_ip = old_current || new_current self.current_sign_in_ip = new_current self.sign_in_count ||= 0 self.sign_in_count += 1 end def update_tracked_fields!(request) # We have to check if the user is already persisted before running # `save` here because invalid users can be saved if we don't. # See https://github.com/heartcombo/devise/issues/4673 for more details. return if new_record? update_tracked_fields(request) save(validate: false) end