1# frozen_string_literal: true 2 3module TtlExpirable 4 extend ActiveSupport::Concern 5 6 included do 7 validates :status, presence: true 8 default_value_for :read_at, Time.zone.now 9 10 enum status: { default: 0, expired: 1, processing: 2, error: 3 } 11 12 scope :read_before, ->(number_of_days) { where("read_at <= ?", Time.zone.now - number_of_days.days) } 13 scope :active, -> { where(status: :default) } 14 15 scope :lock_next_by, ->(sort) do 16 order(sort) 17 .limit(1) 18 .lock('FOR UPDATE SKIP LOCKED') 19 end 20 end 21 22 def read! 23 self.update(read_at: Time.zone.now) 24 end 25end 26