【问题标题】:Rails 3 Time.now without the year?Rails 3 Time.now 没有年份?
【发布时间】:2012-06-24 19:44:46
【问题描述】:

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

【问题讨论】:

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


    【解决方案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)
    }
    

    【讨论】:

    • 无论我选择哪一年,这都适用于显示公告,但公告似乎不再隐藏设定的日期/时间。
    • 您能否给出一个应该隐藏的示例记录以及您用于查找记录的时间。
    • 我在问题的末尾添加了一个示例记录。
    • 读起来有点困难。您能否将其编辑为带有可见键的散列。即 Announcement.last.attributes。然后告诉我当公告没有隐藏时你使用的是什么“hide_time”。
    【解决方案2】:

    几件事。您应该使用 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)
      }
    

    【讨论】:

    • 使用您建议的代码,通知不会在预定时间显示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-24
    • 2011-03-05
    • 2014-05-02
    • 1970-01-01
    相关资源
    最近更新 更多