module Card::Entropic extend ActiveSupport::Concern included do scope :due_to_be_postponed, -> do active .left_outer_joins(collection: :entropy) .where("last_active_at <= DATETIME('now', '-' || COALESCE(entropies.auto_postpone_period, ?) || ' seconds')", Entropy.default.auto_postpone_period) end scope :postponing_soon, -> do active .left_outer_joins(collection: :entropy) .where("last_active_at > DATETIME('now', '-' || COALESCE(entropies.auto_postpone_period, ?) || ' seconds')", Entropy.default.auto_postpone_period) .where("last_active_at <= DATETIME('now', '-' || CAST(COALESCE(entropies.auto_postpone_period, ?) * 0.75 AS INTEGER) || ' seconds')", Entropy.default.auto_postpone_period) end delegate :auto_postpone_period, to: :collection end class_methods do def auto_postpone_all_due due_to_be_postponed.find_each do |card| card.auto_postpone(user: User.system) end end end def entropy Card::Entropy.for(self) end def entropic? entropy.present? end end