2013-05-28 10 views
5

Pracuję nad projektem z interfejsem railsowym i klientem iOS, używając pola updated_at jako odwołania do wykrywania modyfikacji na serwerze, które nastąpiły po ostatnie pociągnięcie od klienta.ActiveRecord: milisekundy nie są brane pod uwagę podczas korzystania z klauzuli where

updated_at datetime ma precyzję w milisekundach, co oznacza, że ​​

Model.updated_at.to_f 

powraca coś jak "1368977381.063427". To jest wysyłane do klienta sformatowanego jako "2013-05-19T15: 29: 41.063427000Z".

Problem polega na tym, że gdy otrzymam tę datę z powrotem od klienta, przeanalizuję ją i zapytam, tracąc milisekundy.

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

jest tak dobre, jak robi

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

W rezultacie, zawsze uzyskać co najmniej jeden wynik, kiedy powinienem dostać nic, bo milisekund są obcinane.

Jak mogę uwzględnić te dane w zapytaniu?

Odpowiedz

5

Spróbuj

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

Można również ustawić ten format jako standardowego formatu dla DateTime w bazach danych przez ustawienie (czyli w initiallizer):

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

następnie pierwotnym zapytaniu znowu działa:

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

Zobacz Rails API dla DateTime.to_s (alias .t o_formated_s)

+0

Przeczytaj i pomyśl "Oczywiście!" :) – Nycen

+0

Mój problem polegał na tym, że dokładność znacznika czasu przechowywanego w bazie danych wynosiła 5 miejsc po przecinku, podczas gdy mój klient zapisywał znacznik czasu do 3 miejsc po przecinku ... podczas wykonywania zapytania większego niż zapytanie zawsze zwracał ten sam rekord z powodu dodatkowych 2 miejsc po przecinku. – JBlake

+1

Jestem zaskoczony, że nie ma bardziej natywnego sposobu obsługi milisekund w Railsach. : -/ –

1

Jeśli używasz standardu ISO8601, możesz użyć .iso8601(10). Nie wiem dlaczego, ale domyślnie zaokrąglane są do sekund.

Powiązane problemy