【问题标题】:Fetch a Rails ActiveRecord 'datetime' attribute as a DateTime object获取 Rails ActiveRecord 'datetime' 属性作为 DateTime 对象
【发布时间】:2011-02-20 07:40:17
【问题描述】:

我的一个模型中有一个包含日期/时间值的属性,并且在我的迁移中使用t.datetime :ended_on 声明。

当我使用myevent.ended_on 获取这个值时,我得到一个Time 对象。问题是当我尝试将此属性用作Flotilla 图表中的轴时,它无法正常工作,因为Flotilla 仅将日期识别为DateDateTime 对象。

我曾考虑编写一个虚拟属性,将现有的时间值转换为日期时间,但我对此持谨慎态度,因为我听说时间无法处理 2040 年以后的日期,而我不这样做'不想冒险制造“2040 年错误”以供以后担心。

有什么方法可以说服 ActiveRecord 为该属性返回 DateTime 对象而不是 Time 对象?

【问题讨论】:

  • 如果您使用的是 64 位计算机,那么 2038 年之后的日期应该不会有问题。至少我可以创建远超过 2038 年的时间实例。

标签: ruby-on-rails datetime activerecord time


【解决方案1】:

您始终可以创建一个方法来覆盖该属性,如下所示:

class YourModel

  ....

  def ended_on
    self['ended_on'].to_datetime # if you need date object use to_date instead
  end

  ....
end

希望对你有帮助

【讨论】:

  • 谢谢,这似乎可以完成这项工作。我实际使用的代码是self['ended_on'] && self['ended_on'].to_datetime,所以使用 nil 值不会有任何问题。我还是有点担心 2040 年,但我想在那之前会有很多新版本的 Rails 需要升级。
【解决方案2】:

您可以使用Time::to_dateTime::to_datetime 轻松转换Time 对象。欲了解更多信息:http://api.rubyonrails.org/classes/ActiveSupport/CoreExtensions/Time/Conversions.html#M001125

所以你应该像这样改变你的代码:

myevent.ended_on.to_date
# or
myevent.ended_on.to_datetime

【讨论】:

    猜你喜欢
    • 2014-10-10
    • 1970-01-01
    • 2016-06-26
    • 2017-08-11
    • 2022-01-24
    • 2014-09-17
    • 1970-01-01
    • 2012-10-06
    • 2019-09-06
    相关资源
    最近更新 更多