0

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

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 ,它仍然会放入当前年份。

4

2 回答 2

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)
}
于 2012-06-24T20:25:16.307 回答
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)
  }
于 2012-06-24T22:54:19.880 回答