Ruby on rails 3 Rails 3次。现在没有年份了吗?

Ruby on rails 3 Rails 3次。现在没有年份了吗?,ruby-on-rails-3,date,time,controller,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_ti

我有一个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

即使我在datetime字段的输入选择框中设置了:exclude_year,它仍然将当前年份放在其中。

如果您使用的是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)
}
作用域:活动,lambda{
其中(“天(开始时间)=?”,
Time.now.utc.day,
Time.now.utc.month,
Time.now.utc.day,
时间。现在。utc。月份)
}

两件事。你应该使用而不是,或者如果我理解正确,你希望时间介于这些项目之间。第二件事是你需要指定它是在一天的开始和结束。现在,它只是被设置为“现在”,并没有很清楚地说明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)
  }
课程公告结束',Time.zone.now.end\u of \u day,Time.zone.now.start\u of \u day)
}
经营范围:自年月日起|
其中('updated_at>?AND start_at>?',Time.zone.now.end_of_day,Time.zone.now.start_of_day)
}

无论我选择哪一年都可以显示公告,但公告似乎不再隐藏在设定的日期/时间内。你能给出一个应该隐藏的示例记录以及查找记录的时间吗?我在问题的末尾添加了一个示例记录。这有点难读。你能把它编辑成一个有可见键的散列吗。i、 公告,最后一条。然后再告诉我当公告未隐藏时您使用的“隐藏时间”。使用您建议的代码,公告不会在预定时间显示。
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)
}
  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)
  }