Сериализация XML не включает миллисекунды в поле даты и времени из модели Rails - PullRequest
1 голос
/ 08 марта 2010

По умолчанию поле даты и времени из базы данных преобразуется и удаляет миллисекунды:

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):

Я пытался разобрать строку в объекте времени, но не могу включить в него миллисекунды;

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

Может кто-нибудь помочь получить дату и время в миллисекундах с помощью to_xml?

Ответы [ 2 ]

0 голосов
/ 31 мая 2010

Я начал изучать Ruby, и Мэтс произвел на меня впечатление «Принцип наименьшего сюрприза».

Но реализация Date and Time в Ruby (и Rails) полна сюрпризов:

Начиная с простого кода:

требуется 'время'
=> правда
dt = Time.now
=> 2010-05-31 17:18:39 + 0100
Time.parse (dt.to_s) == dt
=> false!?!?!?!?
dt.to_s (: дБ)
ArgumentError: неверное количество аргументов (1 для 0)
из (irb): 5: в to_s'<br> from (irb):5<br> from C:/Ruby19/bin/irb:12:in '

хорошо, давайте возьмем несколько Rails:

sqlserver_test / development ?: dt2 = Time.zone.now
=> Понедельник, 31 мая 2010 г. 17:24:54 CEST +02: 00
sqlserver_test / development: dt2.class
=> ActiveSupport :: TimeWithZone
sqlserver_test / development: Time.zone.parse (dt2.to_s) == dt2
=> false
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
=> false

(все работает на Ruby 1.9.1 с Rails 2.3.5 на Windows Xp)

В настоящее время я нахожу только несколько "взломов" в отношении полей и баз данных DateTime. но нет чистого решения БЕЗ сюрпризов ...

0 голосов
/ 08 марта 2010

Как оказалось, я могу исключить исходное поле datetime и добавить собственный метод, который, в свою очередь, отображает datetime в виде строки в 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 отлично работает с включенными моделями и любыми другими опциями, которые я передаю.

...