class ApiToken < ApplicationRecord belongs_to :user # Validations validates :token, presence: true, uniqueness: true # Callbacks before_validation :generate_token, on: :create # Scopes scope :active, -> { where("expires_at IS NULL OR expires_at > ?", Time.current) } # Instance methods def expired? expires_at.present? && expires_at < Time.current end def touch_last_used! update_column(:last_used_at, Time.current) end private def generate_token self.token ||= SecureRandom.urlsafe_base64(32) end end