2012-04-04 12 views
1

常に現在のコンテスト(start_dateとend_date datetimeで定義)があるアプリがあります。私は、before_filterとしてapplication_controller.rbに次のコードを書いています。特定の時刻に次または前日の日曜日の日時を設定します。

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 

私の質問は:一定時間午後8時(例えば次の日曜日)で次の日曜日意味何かにEND_DATE:

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

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

ありがとうございます!

答えて

3

このスニペットから始めます。レールでは、ないその日付以降の日付/時刻オブジェクト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(コアルビーではありません!)には、必要なすべての日付/時刻操作機能があります。 change機能がどのように動作するか

注:あなただけそれ:hourを渡した場合、それはあなたがそれ:hour:minuteを渡すと、それが唯一の第二にリセットされます0に分と秒をリセットします。詳細は、the docsを参照してください。

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

+0

ありがとうございました。しかし、最終的に私はその日にどのように時間を指定するのですか(例えば、午後8時)。 – Marc

+0

答えが更新されました。 –

+0

いいね!私は今夜​​それを試すつもりです – Marc

関連する問題