2012-05-15 28 views
0
觸發過程

讓我們假設我們有一個表,產品ActiveRecord的,如何在列時間滿足

+---+------+--------+--------------+ 
| id| name| status | expiry_date | 
+---+------+--------+--------------+ 
| 1 | A | Good | 10 min ago | <-- this supposed to be "Expired" 
| 2 | B | Good | 10 min later | 
+---+------+--------+--------------+ 

我的問題是如何編號1的狀態設置爲「已過期」,因爲它到期日已通過。

我通常做這與cron任務。然而,讀取整個表格以找到幾行並不高效,我認爲,此外,一個cron任務不會更新狀態,直到它的間隔到來(即10分鐘,20分鐘等等)

有什麼辦法可以觸發當一個時間滿足時立即進行處理,以便我可以儘快更新其狀態?

希望我的問題很清楚。

+0

您可以創建一個範圍 http://stackoverflow.com/questions/5456278/association-data-in- Rails的模型範圍 –

回答

0

如果你暗示控制器的動作中,你會喜歡做的更新,你可以做到以下幾點:

Product.where(["expire_date < ?", ->{ Time.now.utc - 10.minutes }.call]).update_all(:status, 'Bad') 

更新。或者如果你只是想給定ID更新單品:

product = Product.find(params[:id]) 

if product.expire_date < Time.now.utc - 10.minutes 
    product.status = 'Bad' 
    product.save 
end