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