2012-05-15 3 views
0
을 충족 될 때 프로세스를 실행하는 방법을

는 제품, 이제 우리는 테이블이 있다고 가정하자액티브, 열 시간이

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

내 질문은 "만료"로 ID 1의 상태를 설정하는 방법이기 때문에 유효 기간 통과된다.

나는 보통 cron 작업으로이 작업을 수행했습니다. 그러나, 전체 행을 찾기 위해 테이블 ​​전체를 읽는 것이 효율적이지 않으며, cron 작업이 그 간격이 올 때까지 상태를 업데이트하지 않습니다. (예 : 10 분, 20 분 .. 등)

시간이 다가 오면 즉각적인 처리가 가능하므로 가능한 빨리 상태를 업데이트 할 수 있습니까?

희망 사항은 분명합니다. 이 업데이트를 수행하고자하는 컨트롤러의 동작을 의미하는 경우

+0

http://stackoverflow.com/questions/5456278/association-data-in- 가로장 모형 범위 –

답변

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