2

私はオークションサイトと比較できるアプリケーションに取り組んでいます。

「オークション」には終了日が設定されているので、私の質問は、その時間が発生したときにこのオークションを「終了」に設定するにはどうすればよいかということです。

例えば

オークションA:2012年12月25日午前9時に終了します。

現時点で「閉じている」ことを確認するにはどうすればよいですか?

4

2 に答える 2

3

タイムスタンプと、そのためのメソッドとスコープを使用します。

  1. モデルにタイムスタンプを追加します。多分それを呼び出しますopen_until
  2. タイムスタンプをチェックするclosed?(そしておそらく)メソッドをモデルに定義しますopen?Time.now
  3. closedモデルに(そしておそらくopenスコープを追加します。たぶんそれらの1つを 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(eg )を使用していて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

たとえば、特定の時間にtrueに設定したいモデルの:closed属性がある場合、cronを実行して定期的にrakeタスクを実行し、新しいsが閉じるかどうかを確認する必要があります。AuctionAuction

たとえば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

これは、毎分、RailsAuctionがまだ開いているが:closes_at、過去に新しくなった値を持つインスタンスを検出し、それらのインスタンスを閉じたものとしてマークすることを意味します。

于 2012-12-18T00:25:03.833 に答える