条件のグループを定義するインターフェースがあります。これは、他のモデルと共存するいくつかのそのようなインターフェイスの 1 つです。
これらの条件は、アラートの完全性を判断するためにメッセージ キュー ハンドラーによって呼び出されます。すべてのアラート呼び出しは同じであるため、条件を独自のメソッドに抽象化することで、エンキュー呼び出しを少し乾かそうとします (メソッドが正しい手法であるかどうかは疑問です)。これを行うことで、これらの各条件をテストできるようになると思います。
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
send_limit
excluding
スコープはラムダであることが(オフラインで)提案されたため、より適切な解決策になる可能性があります-@BorisStitnickyの推論によると、ペンチはハンマーとして使用できますが、使用しないでください。私もこの線に沿った答えを受け入れています。