Rails 3 Time.now没有一年?

时间:2012-06-24 19:44:47

标签: ruby-on-rails-3 date time controller

我有一个Rails 3应用程序,它是我们公司的基本内联网。我有一个公告控制器,它会检查使用与当前日期匹配的预定日期创建的任何公告。

class Announcement < ActiveRecord::Base
  scope :active, lambda {
    where("starts_at <= ? AND ends_at >= ?", Time.now.utc, Time.now.utc)
  }
  scope :since, lambda { |hide_time|
    where("updated_at > ? OR starts_at > ?", hide_time.utc, hide_time.utc) if hide_time
  }

  def self.display(hide_time)
    active.since(hide_time)
  end

end

但是,大多数公告将在预定结束日期的一周左右内删除。所有其他公告都是简单的生日快乐消息给工作人员。由于我们使用公告系统的方式,只检查日/月而不是年份似乎是明智的,因为生日信息等将是年度的。

在我的控制器代码中“忽略”年份最简单的方法是什么?

更新

我已将控制器代码更新为以下代码,但是,在结束日期时间之后,公告不再隐藏。

class Announcement < ActiveRecord::Base
  scope :active, lambda {
  where("day(starts_at) <= ?
         AND month(starts_at) <= ?
         AND day(ends_at) >= ? 
         AND month(ends_at) >= ?",
         Time.now.utc.day,
         Time.now.utc.month,
         Time.now.utc.day,
         Time.now.utc.month)
  }
  scope :since, lambda { |hide_time|
    where("day(starts_at) > ?
           AND month(starts_at) > ?", 
           hide_time.utc.day, hide_time.utc.month) if hide_time
  }

  def self.display(hide_time)
    active.since(hide_time)
  end

end

示例记录:

22, 'Test Announcement', 'This is a test announcement, please ignore it. Seriously - stop  reading.', '2012-06-25 13:40:00', '2012-06-25 13:55:00', '2012-06-25 13:47:23', '2012-06-25   13:52:15');

即使我在日期时间字段的输入选择框中设置了:exclude_year,它仍会将当前年份放入。

2 个答案:

答案 0 :(得分:1)

如果您使用的是MySQL数据库,则可以使用其day()和month()方法。我不知道是否可以在其他数据库中找到这些方法。因此,这样做可能会使您的代码依赖于数据库服务器。

scope :active, lambda {
  where("day(starts_at) <= ?
         AND month(starts_at) <= ?
         AND day(ends_at) >= ? 
         AND month(ends_at) >= ?",
         Time.now.utc.day,
         Time.now.utc.month,
         Time.now.utc.day,
         Time.now.utc.month)
}

答案 1 :(得分:0)

夫妻俩。如果我理解正确,你应该使用AND而不是OR,你希望时间介于那些项目之间。第二件事是你需要指明它是在一天的开始和一天结束。现在它只是设置为现在,并没有真正说明24小时的广阔空间:

  class Announcement < ActiveRecord::Base
  scope :active, lambda {
    where('starts_at < ? AND ends_at > ?', Time.zone.now.end_of_day, Time.zone.now.beginning_of_day)
  }
  scope :since, lambda { |hide_time|
    where('updated_at > ? AND starts_at > ?', Time.zone.now.end_of_day, Time.zone.now.beginning_of_day)
  }