何かやってみるブログ

興味をもったこと、趣味のこと、技術について色々書きます。

[Rails メモ] Deviseでログイン回数とかトラッキング情報を意図的にUpdateしたい場合

レビューしている時に touchメソッド使って current_sign_in_atとかを力技で更新をしているのをみてもっと良い方法がないかと調べて見つけたのでメモに残す。

結論としては Devise::Models::Trackableモジュールの #update_track_fields!を使えば良い。 リポジトリを In this repository検索して出てきたコードを読んで見つけたので何かで使ったときは同じ手法を使ってみたい。

https://github.com/heartcombo/devise/blob/8593801130f2df94a50863b5db535c272b00efe1/lib/devise/models/trackable.rb#L33

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