在特定时间调用模型方法(Ruby on Rails)

时间:2012-03-29 22:47:11

标签: ruby-on-rails

我有一个Ruby on Rails模型,它有一个名为expiration_date的列。达到到期日期后,我希望修改模型上的其他列(例如expired = true)。有什么好方法可以做到这一点?

理想情况下,我希望在达到到期日的确切时刻调用模型函数。

3 个答案:

答案 0 :(得分:6)

使用delayed_job gem。安装delayed_job gem之后,请执行以下操作:

class Model < ActiveRecord::Base

  after_create :set_expiry_timer

  # register the timer
  def set_expiry_timer
    delay(:run_at => expiration_date).expire
  end

  def expire
    update_attribute(:expired, true) unless expired?
  end

end

答案 1 :(得分:2)

对于您描述的方案,最佳解决方案是使用expired方法而不是列,如果expiration_date大于或等于当前日期,则返回true。

对于其他场景,我会使用DB预定事件触发存储过程。该过程将检查模型表中所有行的expiration_date列,并相应地更新expired(或其他(s))列。

答案 2 :(得分:0)

您是否考虑过使用调度程序来自动执行此操作?像ResqueDelayed JobCron这样的工作正常。

然后在你的预定任务中,你可能会有这样的事情:

if foo.expiration_date < Time.now
  foo.is_expired = true
  foo.save
end