我有一个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,它仍会将当前年份放入。
答案 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)
}