2

我正在开发一个可以比作拍卖网站的应用程序。

“拍卖”有一个固定的截止日期,所以我的问题是,当那个时间发生时,如何将这个拍卖设置为“结束”。

例如

拍卖 A:2012 年 12 月 25 日上午 9:00 结束。

我如何确保它此时“关闭”?

4

2 回答 2

3

我会简单地使用时间戳,以及方法和范围。

  1. 为您的模型添加时间戳,也许可以调用它open_until
  2. 在您的模型中定义一个closed?(也许是open?)方法来检查时间戳Time.now
  3. 为您的模型添加一个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
于 2012-12-18T02:04:22.093 回答
1

例如,如果: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过去新值的实例,将这些实例标记为关闭。

于 2012-12-18T00:25:03.833 回答