【问题标题】:XML Serialization is not including milliseconds in datetime field from Rails modelXML 序列化不包括 Rails 模型的日期时间字段中的毫秒数
【发布时间】:2010-03-08 18:44:20
【问题描述】:

默认情况下,数据库中的日期时间字段正在被转换并去除毫秒:

some_datetime => "2009-11-11T02:19:36Z"

attribute_before_type_cast('some_datetime') => "2009-11-11 02:19:36.145"

如果我尝试覆盖此属性的访问器,例如;

def some_datetime
  attribute_before_type_cast('some_datetime')
end

当我为该模型尝试“to_xml”时,我收到以下错误:

NoMethodError(未定义的方法 “2009-11-11”的“xmlschema” 02:19:36.145”:字符串):

我尝试将字符串解析为 Time 对象,但找不到包含毫秒数的对象;

  def some_datetime
    Time.parse(attribute_before_type_cast('some_datetime').sub(/\s/,"T").sub(/$/,"Z"))
  end

谁能帮助获取由 to_xml 呈现的以毫秒为单位的日期时间?

【问题讨论】:

    标签: ruby-on-rails activerecord xml-serialization models


    【解决方案1】:

    事实证明,我可以排除原始日期时间字段,并添加一个自定义方法,该方法将日期时间作为字符串呈现给 to_xml。这感觉很骇人听闻,但它确实有效。还有其他方法可以直接在原始日期时间字段中获取毫秒数吗?

    在每个模型中,我排除“除外”具有我想要更改的日期时间的字段名称,并包含具有相同名称的“方法”,在类型转换之前返回属性。

      def to_xml(options = {})
        options[:methods] = [:some_datetime]
        options[:except] = [:some_datetime]
        super
      end
    
      def some_datetime
        attribute_before_type_cast('some_datetime')
      end
    

    渲染 to_xml 非常适合包含的模型和我传入的任何其他选项。

    【讨论】:

      【解决方案2】:

      我已经开始学习 Ruby,对 Mats 的“最小惊喜原则”印象深刻。

      但是 Ruby(和 Rails)中的日期和时间实现充满了惊喜:

      从一个普通的 irb 开始:

      需要“时间”
      => 真的
      dt = 时间.now
      => 2010-05-31 17:18:39 +0100
      Time.parse(dt.to_s) == dt
      => 假的!?!?!?!?
      dt.to_s(:db)
      ArgumentError:参数数量错误(1 代表 0)
      来自 (irb):5:in to_s'
      from (irb):5
      from C:/Ruby19/bin/irb:12:in
      '

      好吧,让我们来看看 Rails:

      sqlserver_test/development?:dt2 = Time.zone.now
      => 2010 年 5 月 31 日星期一 17:24:54 CEST +02:00
      sqlserver_test/开发:dt2.class
      => ActiveSupport::TimeWithZone
      sqlserver_test/development: Time.zone.parse(dt2.to_s) == dt2
      => 假
      sqlserver_test/开发:dt2.to_s(:db)
      =>“2010-05-31 15:24:54”
      sqlserver_test/开发:dt2.to_s(:iso8601)
      => "2010-05-31 17:24:54 +0200"
      sqlserver_test/开发:dt2.to_s(:iso8601) == dt2.iso8601
      => 假的

      (全部在 Ruby 1.9.1 和 Rails 2.3.5 上运行在 Windows Xp 上)

      目前我只发现几个关于日期时间字段和数据库的“黑客” 但没有没有惊喜的干净解决方案......

      【讨论】:

        猜你喜欢
        • 2015-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-09
        • 2022-08-18
        • 2020-08-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多