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

时间:2016-09-02 23:04:00

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

我的应用程序集中有一个计时器类,在创建后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,我有一种微弱的感觉,这就是需要它的情况。

2 个答案:

答案 0 :(得分:1)

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

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

来自Twilio的tutorial如何制作提醒应用。

答案 1 :(得分:0)

运行“cron job”是这样做的一种方式。但不是每分钟运行一次,最好每小时运行一次,除非有一个特定的理由要有1分钟的准确度。

ActiveJob(reference)是实现此目的的一种方法。我会推荐Sidekiq,因为它对我们很有用。但是,如果没有关于您的环境的特定信息(Heroku?),我无法准确指定如何操作。