La serializzazione XML non include i millisecondi nel campo datetime dal modello Rails
-
18-09-2019 - |
Domanda
Per impostazione predefinita, il campo data/ora del database viene convertito e vengono rimossi i millisecondi:
some_datetime => "2009-11-11T02:19:36Z"
attributo_before_type_cast('some_datetime') => "2009-11-11 02:19:36.145"
Se provo a sovrascrivere la funzione di accesso per questo attributo come;
def some_datetime
attribute_before_type_cast('some_datetime')
end
quando provo "to_xml" per quel modello, ottengo il seguente errore:
Nomethoderror (metodo non definito `xmlschema 'per" 2009-11-11 02: 19: 36.145 ": String):
Ho provato ad analizzare String in un oggetto Time ma non riesco a far sì che uno includa i millisecondi;
def some_datetime
Time.parse(attribute_before_type_cast('some_datetime').sub(/\s/,"T").sub(/$/,"Z"))
end
Qualcuno può aiutarmi a ottenere un datetime con i millisecondi renderizzati da to_xml?
Soluzione
Come si è visto, posso escludere il campo datetime originale, e aggiungere un metodo personalizzato che a sua volta rende il datetime come una stringa al to_xml. Questo si sente hacker, ma sta lavorando .. C'è un altro modo per ottenere millisecondi direttamente sul campo datetime originale?
In ogni modello, escludo "tranne" i nomi dei campi che hanno datetimes che voglio cambiato, e includo "metodi" con lo stesso nome di tornare l'attributo prima che sia typecasted.
def to_xml(options = {})
options[:methods] = [:some_datetime]
options[:except] = [:some_datetime]
super
end
def some_datetime
attribute_before_type_cast('some_datetime')
end
Rendering to_xml sta lavorando molto con i modelli inclusi e tutte le altre opzioni che passano.
Altri suggerimenti
Ho iniziato a imparare Ruby e sono rimasto colpito dal "Principio di minima sorpresa" di Mat.
Ma l'implementazione di Date and Time in Ruby (e Rails) è piena di sorprese:
Iniziando con un semplice irb:
richiedono "tempo"
=> vero
dt = Ora.adesso
=> 2010-05-31 17:18:39 +0100
Time.parse(dt.to_s) == dt
=> falso!?!?!?!?
dt.to_s(:db)
Errore argomento:numero errato di argomenti (1 per 0)
da (irb):5:into_s'
'
from (irb):5
from C:/Ruby19/bin/irb:12:in
ok, prendiamo alcuni Rails:
sqlserver_test/sviluppo?:dt2 = Time.zone.now
=> Lun 31 maggio 2010 17:24:54 CEST +02:00
sqlserver_test/sviluppo:dt2.class
=> Supporto attivo::TimeWithZone
sqlserver_test/sviluppo:Time.zone.parse(dt2.to_s) == dt2
=> falso
sqlserver_test/sviluppo:dt2.to_s(:db)
=> "2010-05-31 15:24:54"
sqlserver_test/sviluppo:dt2.to_s(:iso8601)
=> "2010-05-31 17:24:54 +0200"
sqlserver_test/sviluppo:dt2.to_s(:iso8601) == dt2.iso8601
=> falso
(tutto in esecuzione su Ruby 1.9.1 con Rails 2.3.5 su Windows Xp)
Attualmente trovo solo diversi "hack" per quanto riguarda i campi e i database datetime ma nessuna soluzione pulita senza sorprese ...