1

現在のコンテストが常にあるアプリがあります (start_date と end_date datetime によって定義されます)。application_controller.rb に before_filter として次のコードがあります。

def load_contest
 @contest_last = Contest.last
 @contest_last.present? ? @contest_leftover = (@contest_last.end_date.utc - Time.now.utc).to_i : @contest_leftover = 0

 if @contest_last.nil?
  Contest.create(:start_date => Time.now.utc, :end_date => Time.now.utc + 10.minutes)
 elsif @contest_leftover < 0
  @winner = Organization.order('votes_count DESC').first
  @contest_last.update_attributes!(:organization_id => @winner.id, :winner_votes => @winner.votes_count) if @winner.present?
  Organization.update_all(:votes_count => 0)
  Contest.create(:start_date => @contest_last.end_date.utc, :end_date => Time.now.utc + 10.minutes)
 end
end

私の質問:

1) :end_date を次の日曜日の特定の時刻 (例: 次の日曜日の午後 8 時) を表すものに変更したいと考えています。同様に、:start_date を前の日曜日の特定の時刻に設定することもできます。sunday() クラス ( http://api.rubyonrails.org/classes/Time.html#method-i-sunday ) があるのを見ましたが、その日の特定の時間を指定する方法がわかりません。

2) 常に現在のコンテストが必要なこの状況では、それをアプリにロードするより良い方法はありますか? 新しいものが作成された場合は、キャッシュしてからリロードする方がよいでしょうか? これがどのように行われるかはわかりませんが、より効率的であるようです。

ありがとう!

4

1 に答える 1

4

このスニペットから始めます。レールでは、日付/時刻オブジェクトが与えられた場合d、式

d - wday.day

その日付以降ではない最後の日曜日を返します。つまり、その日自体が日曜日の場合、結果は d になります。

次に、次の日曜日を取得します。

sunday1 = d - wday.day
sunday2 = sunday1 + 7.day

両方の時間を設定するには:

sunday1 = (d - wday.day).change(:hour => 8,:min => 30)
sunday2 = (sunday1 + 7.day).change(:hour => 20)

外部モジュールは必要ありません。Rails (コアの Ruby ではありません!) には、必要な日付/時刻操作機能がすべて備わっています。

change関数の動作に注意してください::hourのみを渡すと、分と秒が 0 にリセットされます。 と を渡すと:hour:minute秒のみがリセットされます。詳細については、ドキュメントを参照してください。

最後に 1 つ: 使用しているタイム ゾーンに注意してください。

于 2012-04-05T07:58:31.143 に答える