2012-12-18 3 views
2

나는 경매 사이트와 비교할 수있는 응용 프로그램을 만들고 있습니다.레일즈가 설정된 시간이 지나면 동작이 발생합니다.

"경매"에는 마감 기한이 설정되어 있으므로 내 질문은이 경매가 해당 시간에 "폐쇄"되도록 설정하는 방법입니다.

를 들어

경매 A : 이 2012년 12월 25일 오전 9 닫습니다.

어떻게하면 현재 "폐쇄"되어 있는지 확인합니까?

답변

3

나는 단순히 타임 스탬프와 방법 및 범위에 대해 설명하겠다.

  1. Time.now
  2. 에 대한 타임 스탬프 closed (그리고 아마도 open) scope을 추가를 확인하여 모델의 closed? (그리고 아마도 open?) 메소드를 정의 어쩌면 open_until
  3. 를 호출, 모델에 타임 스탬프를 추가 귀하의 모델에. 어쩌면 경매의 개폐 여부를 즉석에서 확인할 수 있습니다이 설정으로 default_scopereference

로 중 하나를 설정합니다.

Auction.open.all  #=> all open auctions 
Auction.closed.all #=> all closed auctions 
Auction.first.closed? #=> true if 'open_until' is in the past, false otherwise 
Auction.first.open? #=> true if 'open_until' is in the future, false otherwise 

당신이 사용하는 경우 default_scope (예 open), 및 (예를 들어 closed)Auction.unscoped.closedreference를 호출해야합니다.

을 당신이 경매를 종료하는 옵션을 필요로 할 때 다른 주와 함께 경매를 찾을 필요 (즉, 통과하는 open_until를 기다리지 않고) 즉시 당신은 단순히 추가 부울 플래그없이,이 작업을 수행 할 수 있습니다 : 위대한 솔루션 및 설명에 대한

def close! 
    self.update_attribute(:open_until, 1.second.ago) 
end 
1

예를 들어 특정 시간에 true로 설정하려는 Auction 모델에 :closed 속성이있는 경우 주기적으로 rake 작업을 실행하여 닫을 새 Auction을 확인하는 cron을 실행해야합니다 .

는 예를 들어, 당신은 다음에이 레이크 작업을 실행할 수 있습니다

rake myapp:close-auctions 

을 실행하여이 rake를 통해 호출 할 수있는 다음과 같은 내부

namespace :myapp do 
    task "close-auctions" => :environment do 
    Auctions.where("closes_at < ? and closed = ?", Time.zone.now, false).update_all(closed: true) 
    end 
end 

같은 뭔가 lib/tasks/close_auctions.rake에서 파일을 만들 수 있습니다 너의 crontab에있는 cron. 매 순간을 위해 당신은 그 마킹,

이 매 순간을 의미
* * * * * RAILS_ENV=production rake myapp:close-auctions > /dev/null 2>&1 

, 레일 과거에 새로하는 :closes_at 값이 여전히 열려 있지만 Auction 인스턴스를 찾을 수 귀하의 crontab에 이런 식으로 뭔가를 추가 것 인스턴스가 닫힌 것으로 나타납니다.

+0

감사를 0.간단한 질문입니다."* * * * * RAILS_ENV = production rake myapp : close-auctions>/dev/null 2> & 1"이 특정 파일로 이동하여 cron 작업으로 실행됩니까? 대신에 이것을 사용하는 것이 더 쉽고/더 낫습니까? http://railscasts.com/episodes/164-cron-in-ruby? – JamesWatling

+0

'언제든지 '는 위의 명령을 "간단하다"처럼 crontab에 작성하는 도구 일뿐입니다. '언제든지 '는 당신과 crontab 사이의 "중매인"이기 때문에 최종 결과가 동일하기 때문에 실제로는 필요하지 않습니다 : 위와 같은 명령. – deefour

+0

명령의 위치는'crontab -e'를 실행하기 위해 배포하는 사용자로서 편집기에서 cron 명령을 추가 할 쉘이 열립니다. 나는이 프로세스를 더 간단하게하기 위해 언제나 카피스트라노 (또는 다른 배포 도구)가 어떻게 통합 될지 말할 수 없다. – deefour

관련 문제