【问题标题】:How do I create a task in Rails to run one time in the future?如何在 Rails 中创建一个任务以在未来运行一次?
【发布时间】:2018-03-10 08:23:05
【问题描述】:

我有一个基于订阅的网站,如果未注册用户给我他们的电子邮件,他们就可以下载文件。我想要以下工作流程。

  1. 用户提供电子邮件地址

  2. Rails 创建一个未来 7 天的任务

  3. 用户下载电子邮件文件

  4. 如果用户在 7 天内未注册,请向用户发送电子邮件

我需要添加#2 和#4。现在我正在使用 ActiveJob 和 Sidekiq 创建作业以发送下载电子邮件。有没有办法可以创建一个 ActiveJob 以在将来运行?未来的工作是否可以访问我的 rails 环境来检查我的数据库?

【问题讨论】:

    标签: ruby-on-rails sidekiq rails-activejob


    【解决方案1】:

    当然,您可以将 ActiveJob 排入队列以在 1 周内执行。在作业的实施中,如果用户尚未注册,则有条件地发送电子邮件。请参阅有关 ActiveJob 的 Rails 指南:http://guides.rubyonrails.org/active_job_basics.html#enqueue-the-job

    例子:

    # Enqueue a job to be performed 1 week from now.
    UserConfirmationJob.set(wait: 1.week).perform_later(user)
    

    【讨论】:

    • 谢谢,这正是我需要的。我刚刚找到了这个用于测试排队作业的 gem:github.com/gocardless/rspec-activejob
    • 太棒了!如果这对你有用,你能接受我的回答吗?
    【解决方案2】:

    你可以这样做吗:

    1. 用户提供电子邮件。
    2. 你允许他下载。
    3. 您每天运行一个脚本来检查 7 天前发送电子邮件的用户是否已注册。
    4. 如果他还没有注册,你给他发一封电子邮件。

    【讨论】:

    • 我必须每天对照下载者列表检查我的所有用户。然后,我必须在“用户”表中添加一列来检查他们是否已经收到了那封 7 天的电子邮件。如果我想在 30 天后发送另一个,事情会变得更加复杂。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    • 2011-11-14
    • 2022-11-11
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多