1# frozen_string_literal: true
2
3module Schedulable
4  extend ActiveSupport::Concern
5
6  included do
7    scope :runnable_schedules, -> { active.where("next_run_at < ?", Time.zone.now) }
8
9    before_save :set_next_run_at
10  end
11
12  def schedule_next_run!
13    save! # with set_next_run_at
14  rescue ActiveRecord::RecordInvalid
15    update_column(:next_run_at, nil) # update without validation
16  end
17
18  def set_next_run_at
19    raise NotImplementedError
20  end
21end
22