我正在研究可以與拍賣網站進行比較的應用程序。Rails導致在設定的時間量後發生操作
「拍賣」有一個確定的截止日期,所以我的問題是如何讓拍賣在這段時間內「閉合」。
對於實例
拍賣: 關閉2012年12月25日上午9:00。
我該如何確保此時「關閉」?
我正在研究可以與拍賣網站進行比較的應用程序。Rails導致在設定的時間量後發生操作
「拍賣」有一個確定的截止日期,所以我的問題是如何讓拍賣在這段時間內「閉合」。
對於實例
拍賣: 關閉2012年12月25日上午9:00。
我該如何確保此時「關閉」?
我只是簡單地使用時間戳,以及方法和範圍。
open_until
closed?
(也許open?
)方法,檢查對Time.now
closed
(也許open
)scope到你的模型。也許將其中之一設置爲default_scope
reference使用此設置,您可以在飛行中檢查拍賣是否打開或關閉。
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.closed
reference。
當你需要的選項,關閉上拍賣飛(無需等待open_until
路過IE),你可以簡單的說,無需額外的布爾標誌,這樣做:
def close!
self.update_attribute(:open_until, 1.second.ago)
end
如果,例如,你有你想在特定的時間設置爲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。一個簡單的問題。整個「* * * * * RAILS_ENV =生產rake myapp:close-auctions>/dev/null 2>&1」進入特定文件以作爲cron作業運行? http://railscasts.com/episodes/164-cron-in-ruby是否更容易/更好地使用它? – JamesWatling
'每當'只是一個工具,使你的crontab中的命令像上面的「簡單」一樣。 'when'是你和crontab之間的「中間人」,所以它沒有必要,因爲最終的結果是一樣的:一個類似上面的命令。 – deefour
至於命令的執行位置,就像您要運行'crontab -e'一樣部署的用戶,編譯器將在shell中打開以添加cron命令。我無法說出每當或capistrano(或其他部署工具)如何整合以簡化此過程。 – deefour