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