我有一个应用程序,其中始终存在当前比赛(由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)对于总是想要当前比赛的情况,是否有更好的方法在应用程序中加载它?缓存它会更好,然后重新加载如果创建一个新的?不知道如何做到这一点,但似乎更有效率。
谢谢!
答案 0 :(得分:3)
从这个代码段开始。在rails中,给定日期/时间对象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。
最后一件事:注意你正在使用的时区。