2012-12-18 48 views
2

我正在研究可以與拍賣網站進行比較的應用程序。Rails導致在設定的時間量後發生操作

「拍賣」有一個確定的截止日期,所以我的問題是如何讓拍賣在這段時間內「閉合」。

對於實例

拍賣: 關閉2012年12月25日上午9:00。

我該如何確保此時「關閉」?

回答

3

我只是簡單地使用時間戳,以及方法和範圍。

  1. 時間戳添加到您的模型,也許叫它open_until
  2. 定義模型中的closed?(也許open?)方法,檢查對Time.now
  3. 時間戳添加closed(也許openscope到你的模型。也許將其中之一設置爲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路過IE),你可以簡單的說,無需額外的布爾標誌,這樣做:

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

如果,例如,你有你想在特定的時間設置爲true你Auction模型:closed屬性,你需要有一個cron運行定期運行rake任務來檢查新Auction s到關閉。

例如,您可以通過運行

rake myapp:close-auctions 

創建lib/tasks/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 

這可以通過rake被稱爲然後,您可以運行該rake任務一個在您的crontab中的cron。對於每一分鐘你會添加像這樣的東西你的crontab

* * * * * RAILS_ENV=production rake myapp:close-auctions > /dev/null 2>&1 

這意味着每分鐘,Rails會發現任何Auction情況下仍然打開,但其中有一個:closes_at值是新近在過去,那些標記實例關閉。

+0

感謝偉大的答案和解釋0。一個簡單的問題。整個「* * * * * RAILS_ENV =生產rake myapp:close-auctions>/dev/null 2>&1」進入特定文件以作爲cron作業運行? http://railscasts.com/episodes/164-cron-in-ruby是否更容易/更好地使用它? – JamesWatling

+0

'每當'只是一個工具,使你的crontab中的命令像上面的「簡單」一樣。 'when'是你和crontab之間的「中間人」,所以它沒有必要,因爲最終的結果是一樣的:一個類似上面的命令。 – deefour

+0

至於命令的執行位置,就像您要運行'crontab -e'一樣部署的用戶,編譯器將在shell中打開以添加cron命令。我無法說出每當或capistrano(或其他部署工具)如何整合以簡化此過程。 – deefour

相關問題