2013-05-28 14 views
5

Sto lavorando a un progetto con api rails e un client iOS, utilizzando il campo updated_at come riferimento per rilevare le modifiche sul server che si sono verificate dopo il ultimo tiro dal cliente.ActiveRecord: i millisecondi non vengono presi in considerazione quando si utilizza una clausola where

Il datetime updated_at ha una precisione in millisecondi, il che significa che

Model.updated_at.to_f 

restituisce qualcosa come "1368977381,063,427 mila". Questo viene inviato al client formattato come "2013-05-19T15: 29: 41.063427000Z".

Il problema è che quando ottengo quel datetime dal client, lo analizzo e lo interrogo, i millisecondi vengono persi.

last_update = DateTime.strptime("2013-05-19T15:29:41.063427000Z", "%Y-%m-%dT%H:%M:%S.%N%z") 
Model.where("updated_at > ?", last_update) 

è buono come fare

last_update = DateTime.strptime("2013-05-19T15:29:41Z", "%Y-%m-%dT%H:%M:%S%z") 
Model.where("updated_at > ?", last_update) 

Di conseguenza, ho sempre arrivare almeno un risultato quando dovrei ottenere nessuno, perché i millisecondi vengono troncati.

Come posso tenerne conto nella richiesta?

risposta

5

Prova

Model.where("updated_at > ?", last_update.strftime("%Y-%m-%dT%H:%M:%S.%N%z")) 

È anche possibile impostare questo formato come formato standard per DateTime in database impostando (vale a dire in un initiallizer):

Time::DATE_FORMATS[:db]= '%Y-%m-%dT%H:%M:%S.%N%z' 

allora la vostra query originale funziona di nuovo:

Model.where("updated_at > ?", last_update) 

Vedere Rails API per DateTime.to_s (p.t. o_formated_s)

+0

Leggilo e pensa "Certo!" :) – Nycen

+0

Il mio problema era che la precisione del timestamp memorizzato nel database era di 5 cifre decimali, mentre il mio cliente stava memorizzando il timestamp a 3 cifre decimali ... quando si eseguiva un numero maggiore di query, avrebbe sempre restituito lo stesso record a causa dei 2 posti decimali in più. – JBlake

+1

Sono sorpreso che non ci sia un modo più nativo per supportare i millisecondi in Rails. : -/ –

1

Se si utilizza lo standard ISO8601 è possibile utilizzare .iso8601(10). Non so perché, ma arrotonda di secondi per impostazione predefinita.

Problemi correlati