在Ruby中是否有像监听器这样的东西,或类似的东西?
例如,我如何检查用户日期是否已过期,并且需要在几天前发送电子邮件?
感谢你的时间
答案 0 :(得分:3)
从广义上讲,有两种方法可以做到这一点:
定期投票以查看即将到期的内容,并相应地发送电子邮件。例如,您可以使用运行代码的 cron作业:
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作业的流行库。
安排以后的作业,在指定时间运行。这可以通过redis支持的库(例如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.