XML序列化在Rails模型的datetime字段中不包括毫秒

默认情况下,正在转换数据库中的datetime字段并删除毫秒:

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(未定义的方法`xmlschema’代表“2009-11-11 02:19:36.145”:String):

我试图将String解析为Time对象但是不能得到一个包含毫秒;

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

任何人都可以帮助获得由to_xml呈现毫秒的日期时间吗?

事实certificate,我可以排除原始日期时间字段,并添加一个自定义方法,该方法又将日期时间作为字符串呈现给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非常适用于包含的模型和我传入的任何其他选项。

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

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

从简单的irb开始:

要求’时间’
=>是的
dt = Time.now
=> 2010-05-31 17:18:39 +0100
Time.parse(dt.to_s)== dt
=>假!?!?!?!?
dt.to_s(:分贝)
ArgumentError:参数个数错误(1表示0)
from(irb):5:in to_s'
from (irb):5
from C:/Ruby19/bin/irb:12:in
to_s'
from (irb):5
from C:/Ruby19/bin/irb:12: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 / development:dt2.class
=> ActiveSupport :: TimeWithZone
sqlserver_test / development:Time.zone.parse(dt2.to_s)== dt2
=>假
sqlserver_test / development:dt2.to_s(:db)
>“2010-05-31 15:24:54”
sqlserver_test / development:dt2.to_s(:iso8601)
>“2010-05-31 17:24:54 +0200”
sqlserver_test / development:dt2.to_s(:iso8601)== dt2.iso8601
=>假

(所有在Windows XP上使用Rails 2.3.5在Ruby 1.9.1上运行)

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