在Ruby中是否有像监听器这样的东西,或类似的东西?
例如,如何检查用户日期是否已过期并且需要在几天前发送电子邮件?
谢谢你的时间
从广义上讲,有两种方法可以做到这一点:
Model.where(
'expiration_date < ? AND expiration_date >= ?',
Time.now + 3.days,
Time.now
).each do |m|
m.send_reminder_email
end
您可能希望在rake
任务中编写此代码,因此您的cron
作业只会触发它。 (你也可以将上面的查询逻辑重构为scope
;例如Model.exires_soon.each {...}
whenever
是一个流行的库,通过ruby DSL配置cron作业。resque
或sidekiq
)或数据库支持的库(例如delayed_job
)来实现。具体实施可能会根据您的需求而有所不同(例如,expiration_date
是否会发生变化?如何以及何时取消提醒电子邮件?),但例如,您可以执行以下操作:
class Model < ApplicationRecord
after_create :schedule_reminder_email
def schedule_reminder_email
ModelReminderWorker.perform_at(expiration_date - 3.days, self)
end
end
class ModelReminderWorker
include Sidekiq::Worker
def perform
# ...
end
end
您选择的解决方案应根据您的应用程序的特定需求确定;对这个问题没有灵丹妙药的答案。
例如:
sidekiq
你应该没问题,但是频繁的cron工作轮询会导致问题;为了缓解这个问题,您可以考虑添加数据库索引或从从属副本数据库中读取数据。一般来说,我的建议是:
如果您是新手,并且/或者只是希望快速启动并运行某些功能,请使用上面的选项1。但是,如果您正在构建需要在大型系统中扩展的东西,请认真考虑如何最好地实施选项2。