ActiveRecord范围可以查找今天创建的记录吗?

时间:2010-12-01 16:20:19

标签: mysql ruby-on-rails datetime activerecord

这必须是一件容易的事情,但我认为Rail的时区实施正在放弃我的工作......

如何在Rails 3(和ruby 1.9.2)中创建一个范围来查询今天创建的记录?

目前,我正在这样做:

  scope :today, lambda { 
    where("created_at >= ? and created_at <= ?", 
           Date.today.beginning_of_day, Date.today.end_of_day)
  }  

它似乎没有按预期工作。我希望“今天”代表用户当地时区从上午12点到晚上11:59的24小时。我是否需要将日期转换为UTC或其他什么?

3 个答案:

答案 0 :(得分:3)

您需要考虑用户的时区。也就是说,用户时区的日期和结束日期。为此,首先解析用户时区的当前时间。您可以将区域设置为用户的时区并进行计算,也可以使用以下代码的变体直接解析时间。

timezone = current_user.timezone # Mountain Time (US & Canada)
users_current_time = ActiveSupport::TimeZone[timezone].parse(Time.now.to_s)

users_current_time.beginning_of_dayusers_current_time.end_of_day应生成正确的时间范围(如果UTC是您的应用程序时区,您应用将转换为UTC并触发查询)

如果您只想使用范围执行此操作,那么我建议您设置所有操作的Time.zone = current_user.timezone before_filter并在范围内使用它。 This railscast可以很好地了解如何做到这一点。

答案 1 :(得分:1)

如果您正在使用mysql,那么我认为您只想在当天进行匹配,而不是时间对吗?换句话说,你想要从12月1日开始的所有记录。如果您只是搜索日期,则在12月1日的凌晨12:00至晚上11:59之间暗示。

 scope :today, lambda { 
    where("created_at = ?",
           Time.now.strftime("%Y-%d-%m")
  } 

这样的事情应该有效

答案 2 :(得分:0)

这个怎么样?

  scope :today, lambda { 
    where("created_at >= ? and created_at <= ?", 
           Date.today.beginning_of_day.utc, Date.today.end_of_day.utc)
  }