私はオークションサイトと比較できるアプリケーションに取り組んでいます。
「オークション」には終了日が設定されているので、私の質問は、その時間が発生したときにこのオークションを「終了」に設定するにはどうすればよいかということです。
例えば
オークションA:2012年12月25日午前9時に終了します。
現時点で「閉じている」ことを確認するにはどうすればよいですか?
私はオークションサイトと比較できるアプリケーションに取り組んでいます。
「オークション」には終了日が設定されているので、私の質問は、その時間が発生したときにこのオークションを「終了」に設定するにはどうすればよいかということです。
例えば
オークションA:2012年12月25日午前9時に終了します。
現時点で「閉じている」ことを確認するにはどうすればよいですか?
タイムスタンプと、そのためのメソッドとスコープを使用します。
open_untilclosed?(そしておそらく)メソッドをモデルに定義しますopen?Time.nowclosedモデルに(そしておそらく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
たとえば、特定の時間に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、過去に新しくなった値を持つインスタンスを検出し、それらのインスタンスを閉じたものとしてマークすることを意味します。