I have an interface the defines a group of conditions. it is one of several such interfaces that will live with other models.
These conditions will be called by a message queue handler to determine completeness of an alert. All the alert calls will be the same, and so I seek to DRY up the enqueue calls a bit, by abstracting the the conditions into their own methods (i question if methods is the right technique). I think that by doing this I will be able to test each of these conditions.
class Loan
module AlertTriggers
def self.included(base)
base.extend LifecycleScopeEnqueues
# this isn't right
Loan::AlertTriggers::LifecycleScopeEnqueues.instance_method.each do |cond|
class << self
def self.cond
::AlertHandler.enqueue_alerts(
{:trigger => Loan.new},
cond
)
end
end
end
end
end
module LifecycleScopeEnqueues
def student_awaiting_cosigner
lambda { |interval, send_limit, excluding|
excluding ||= ''
Loan.awaiting_cosigner.
where('loans.id not in (?)', excluding.map(&:id) ).
joins(:petitions).
where('petitions.updated_at > ?', interval.days.ago).
where('petitions.updated_at <= ?', send_limit.days.ago)
}
end
end
I've considered alternatives, where each of these methods act like a scope. Down that road, I'm not sure how to have AlertHandler be the source of interval, send_limit, and excluding, which it passes to the block/proc when calling it.