Rails监听过期日期

时间:2018-01-02 19:50:26

标签: ruby-on-rails ruby ruby-on-rails-5 listener

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

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

感谢你的时间

1 个答案:

答案 0 :(得分: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
    
  3. 您选择的解决方案应根据您的应用的具体需求确定;这个问题没有灵丹妙药的答案。

    例如:

    • 您需要多少考虑性能?使用sidekiq你应该没问题,但使用频繁的cron作业进行轮询可能导致问题;为了缓解这种情况,您可以考虑添加数据库索引,或者从从属副本数据库中读取。
    • 您是否担心完全随机发送电子邮件&#34;时间,例如凌晨2点?单独调度的作业可以考虑到这一点,但在单个轮询cron作业中实现它会更容易。 (或许这种行为正是他们想要的!)
    • 考虑如何最好地记录错误,处理部署,控制重启,从崩溃中恢复等等......有很多工具可用于所有这些,但它是一个重要的事情要获得正好在生产应用程序中。

    一般来说,我的建议是:

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