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?
Przeczytaj i pomyśl "Oczywiście!" :) – Nycen
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
Jestem zaskoczony, że nie ma bardziej natywnego sposobu obsługi milisekund w Railsach. : -/ –