我正在开发一个可以比作拍卖网站的应用程序。
“拍卖”有一个固定的截止日期,所以我的问题是,当那个时间发生时,如何将这个拍卖设置为“结束”。
例如
拍卖 A:2012 年 12 月 25 日上午 9:00 结束。
我如何确保它此时“关闭”?
我正在开发一个可以比作拍卖网站的应用程序。
“拍卖”有一个固定的截止日期,所以我的问题是,当那个时间发生时,如何将这个拍卖设置为“结束”。
例如
拍卖 A:2012 年 12 月 25 日上午 9:00 结束。
我如何确保它此时“关闭”?
我会简单地使用时间戳,以及方法和范围。
open_until
closed?
(也许是open?
)方法来检查时间戳Time.now
closed
(也许是open
)范围。也许将其中之一设置为 default_scope
参考使用此设置,您可以即时检查拍卖是打开还是关闭。
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
通过),您可以简单地,无需额外的布尔标志,执行以下操作:
def close!
self.update_attribute(:open_until, 1.second.ago)
end
例如,如果:closed
您的模型上有一个属性Auction
要在某个时间设置为 true,则需要运行 cron 以定期运行 rake 任务以检查Auction
要关闭的新 s。
例如,您可以在其中创建一个文件,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 myapp:close-auctions
然后,您可以在 crontab 中的 cron 上运行此 rake 任务。每分钟你都会在你的 crontab 中添加这样的东西
* * * * * RAILS_ENV=production rake myapp:close-auctions > /dev/null 2>&1
这意味着每一分钟,Rails 都会找到任何Auction
仍然打开但具有:closes_at
过去新值的实例,将这些实例标记为关闭。