Rails监听过期日期

问题描述 投票:0回答:1

在Ruby中是否有像监听器这样的东西,或类似的东西?

例如,如何检查用户日期是否已过期并且需要在几天前发送电子邮件?


谢谢你的时间

ruby-on-rails ruby ruby-on-rails-5 listener
1个回答
3
投票

从广义上讲,有两种方法可以做到这一点:

  1. 定期轮询即将到期的内容,并相应地发送电子邮件。例如,您可以使用运行代码的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作业。
  2. 安排未来的工作,在指定的时间运行。这可以通过redis支持的库(例如resquesidekiq)或数据库支持的库(例如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工作轮询会导致问题;为了缓解这个问题,您可以考虑添加数据库索引或从从属副本数据库中读取数据。
  • 您是否担心完全“随机”发送电子邮件,例如凌晨2点?单独安排的作业可以考虑这一点,但在单个轮询cron作业中实现这一点会更容易。 (或许这种行为正是所期望的!)
  • 考虑如何最好地记录错误,处理部署,控制重启,从崩溃中恢复等等......有很多工具可用于所有这些,但在生产应用程序中找到正确的方法是很重要的。

一般来说,我的建议是:

如果您是新手,并且/或者只是希望快速启动并运行某些功能,请使用上面的选项1。但是,如果您正在构建需要在大型系统中扩展的东西,请认真考虑如何最好地实施选项2。

© www.soinside.com 2019 - 2024. All rights reserved.