我有一个定义一组条件的接口。它是与其他模型一起使用的几个此类接口之一。
这些条件将由消息队列处理程序调用以确定警报的完整性。所有的警报调用都是一样的,所以我试图通过将条件抽象到它们自己的方法中来稍微干掉入队调用(我质疑方法是否是正确的技术)。我认为通过这样做,我将能够测试这些条件中的每一个。
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
我已经考虑过替代方案,其中每种方法都像一个范围。在那条路上,我不确定如何成为, 和AlertHandler
的来源interval
,它在调用它时传递给块/proc。 send_limit
excluding
有人建议我(离线)范围是 lambda,因此可能是更合适的解决方案 - 根据@BorisStitnicky 推断,钳子可以用作锤子,但不应该。我也愿意接受这方面的答案。