我有一个Ruby on Rails模型,它有一个名为expiration_date
的列。达到到期日期后,我希望修改模型上的其他列(例如expired = true
)。有什么好方法可以做到这一点?
理想情况下,我希望在达到到期日的确切时刻调用模型函数。
答案 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)
您是否考虑过使用调度程序来自动执行此操作?像Resque,Delayed Job或Cron这样的工作正常。
然后在你的预定任务中,你可能会有这样的事情:
if foo.expiration_date < Time.now
foo.is_expired = true
foo.save
end