【问题标题】:ActiveRecord where method datetime passed方法日期时间通过的 ActiveRecord
【发布时间】:2013-11-29 23:11:57
【问题描述】:

感谢您对我在 Rails 应用程序中的最新尝试的持续支持。自从我在 Rails 中制作东西以来已经有一段时间了,所以这是我最新的问题。感谢大家过去提供的帮助。

我有一个名为 Event.rb 的模型,其中包含事件的日期:日期和时间:时间字段。

我在模型内部也有一个方法是..

def begins
    DateTime.new(date.year, date.month, date.day, time.hour, time.min, time.sec)
end

因为我只有单独的日期和时间,所以我看不到某些事情是否真的过去了,所以我需要将它们放在一起。

我的问题是……

我希望能够在我的模型中添加 DateTime :begins 到以下其他方法...

def self.past
    where("date <= ?", TIME_NOW)
end

就像我有一个方法是......

def upcoming?
    self.date >= Time.now
end

我可以轻松地将 self.date 更改为开始和我想象的过去?

谢谢!

【问题讨论】:

  • 使用self.past,您是要检查单个实例是否已经过去,还是要查询数据库以获取过去的事件?
  • 对于那个,它只用于@events = Event.past,然后另一个用于Event.find(1).upcoming?

标签: ruby-on-rails ruby datetime activerecord


【解决方案1】:

也许这样的方法可以使用您现有的 datetime 列查询数据库中的过去事件:

scope :past, lambda {
  where("date <= ? and time <= ?",
         Time.now.strftime("%Y-%d-%m"),
         Time.now.strftime("%H:%M:%S")
       )
}

past_events = Event.past

为了检查当前实例,您可以继续使用您的begins 方法:

def past?
  begins < DateTime.now
end

@event = Event.first
@event.past?

【讨论】:

  • 谢谢,但是我确实收到以下错误。PG::DatetimeFieldOverflow: ERROR: date/time field value out of range: "2013-30-11" LINE 1: ...s" WHERE "events"."flagged" IS NULL AND (date &gt;= '2013-30-1... ^ HINT: Perhaps you need a different "datestyle" setting. 不确定如何解决提示。
  • 您可以尝试发送日期where("date &lt;= date(?)... 或者您可以使用postgres 的now() 函数:where("date &lt;= now() and time &lt;= localtime())。我不确定 now() 是否是最好的主意,因为您可能不得不担心用户的时区。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-16
  • 1970-01-01
相关资源
最近更新 更多