1

我有一个应用程序,其中总是有一个当前的比赛(由 start_date 和 end_date 日期时间定义)。我在 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

从这个片段开始。在 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,它只会重置秒。有关详细信息,请参阅文档

最后一件事:注意您使用的时区。

于 2012-04-05T07:58:31.143 回答