2012-04-04 53 views
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設置爲前一個星期日。我看到有一個星期日()類(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(但不是核心ruby!)具有您需要的所有日期/時間操作功能。

注意change功能是如何工作的:如果你傳遞:hour而已,它會重置分秒爲0。如果你通過它:hour:minute,它將重置只是第二。詳情請參閱the docs

最後一件事:請注意您正在使用的時區。

+0

謝謝。但最終我會如何在那些日子裏指定一個時間(例如,晚上8點)? – Marc 2012-04-05 11:31:49

+0

答覆已更新。 – 2012-04-05 13:26:27

+0

看起來不錯!我今晚要測試它 – Marc 2012-04-05 16:23:57

相關問題