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?

È stato utile?

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:in to_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 ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top