如何在设定时间后更改模型的属性

How do I change attributes of a model after a set time

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

有没有办法在创建日期后 运行 expire_if_running 24 小时,或者我必须每分钟 运行 一个 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,我隐隐觉得这种情况需要它。

运行 "cron job" 是一种方法。但是与其每分钟 运行 宁,不如每小时 运行 更好,除非有特定原因需要 1 分钟的准确性。

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

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

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

这是来自 Twilio 的 tutorial 关于如何制作提醒应用的文章。