2012-03-29 70 views
4

我有一個名爲expiration_date的列的Ruby on Rails模型。一旦達到有效期,我想要修改模型上的另一列(例如expired = true)。有什麼好辦法做到這一點?在特定時間調用模型方法(Ruby on Rails)

理想情況下,我希望在達到失效日期的確切時刻調用模型函數。

+0

除了設置'expired = true'之外,還有什麼其他的你想要做的嗎? – 2012-03-29 23:05:32

回答

1

對於您描述的情況,最佳解決方案是使用expired方法而不是列,如果expiration_date大於或等於當前日期,則返回true。

對於其他方案,我會使用觸發存儲過程的DB預定事件。該過程將檢查模型表中所有行的expiration_date列,並相應地更新expired(或其他(s))列。

0

你有沒有考慮過使用調度器來自動執行此操作?類似Resque,Delayed JobCron會正常工作。

然後在您的計劃任務,你可以有這樣的事情:

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

使用delayed_job寶石。安裝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(:is_expired, true) unless is_expired? 
    end 

end