【问题标题】:How do I change attributes of a model after a set time如何在设定时间后更改模型的属性
【发布时间】:2016-09-02 23:03:59
【问题描述】:

我的应用程序中有一个计时器类设置为在创建后 24 小时到期。

有没有办法在创建日期后 24 小时运行 expire_if_running,还是我必须每分钟运行一次 cron 作业?

class Timer < ApplicationRecord
  enum status: {
    running: 1, # the default
    expired: 2 # timed out
    finished: 3 # completed
  }

  # if the Timer isn't finished, expire it
  def expire_if_running
    self.status = "expired" if self.running?
  end
end

请提供示例代码或引用您的答案。我以前从未使用过 ActiveJob,我隐约感觉到这是需要它的那种情况。

【问题讨论】:

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


    【解决方案1】:

    我找到了一种使用 delayed_job 运行完全相同的场景的方法,因为它可以在未来的某个时间运行,所以效果更好。

    按分钟计的 cronjob 可能会延迟 59 秒使计时器到期。
    按小时计算的 cronjob 可能会延迟 59 分钟使计时器到期。

    这是来自 Twilio 的tutorial,介绍了如何制作提醒应用程序。

    【讨论】:

      【解决方案2】:

      运行“cron 作业”是一种方法。但与其每分钟运行一次,不如每小时运行一次,除非有特定原因需要 1 分钟的准确度。

      ActiveJob (reference) 是一种方法。我会推荐 Sidekiq,因为它对我们很有用。但是,如果没有有关您的环境(Heroku?)的具体信息,我无法具体说明如何操作。

      【讨论】:

      • 我们目前正在生产中使用 Heroku,但我们计划最终迁移到我们自己的基础架构。 ActiveJob 没有它自己的语法,就像 ActiveRecord 的 ORM 一样。
      • 阅读 ActiveJob 的文档后,它似乎在未来的特定时间运行任务。对于“cron 作业”功能,您可以使用 Heroku 调度程序。编写一个 rake 任务来更新所有过期作业的状态。
      猜你喜欢
      • 1970-01-01
      • 2018-10-09
      • 2014-01-12
      • 2021-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-23
      • 2014-09-27
      相关资源
      最近更新 更多