2013-05-28 35 views
5

bir yan tümce kullanırken kullanılmaz milisaniye bir raylar api ve bir iOS istemcisi ile bir proje üzerinde çalışıyorum, sonra güncelleştirilen sunucu üzerinde yapılan değişiklikleri algılamak için updated_at alanı referans olarak kullanarak müşteriden son çekiş.ActiveRecord: nerede

updated_at datetime anlamına milisaniye cinsinden bir kesinliği vardır "1368977381.063427" gibi

Model.updated_at.to_f 

döner bir şey. Bu, "2013-05-19T15: 29: 41.063427000Z" biçiminde biçimlendirilmiş istemciye gönderilir.

Sorun, bu tarih bilgisini istemciden geri aldığımda, ayrıştırıp sorguladığında, milisaniye kayıpları olur. Ben hiçbirini almak gerekirken milisaniye kesik olduğu için

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

Sonuç olarak

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

yapıyor kadar iyidir, ben her zaman, en az bir sonuç almak.

Sorgularımda bunları nasıl dikkate alabilirim?

cevap

5

(bir initiallizer yani) ayarlayarak Ayrıca veritabanlarında DateTime için standart biçimi olarak bu biçimi ayarlayabilirsiniz

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

deneyin:

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

ardından orijinal sorgu tekrar çalışır:

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

için DateTime.to_s (aka .t o_formated_s)

+0

Bunu okuyun ve "Tabii ki!" :) – Nycen

+0

Sorunum, veritabanında depolanan zaman damgasının kesinliğinin 5 ondalık basamağa olmasıydı, oysa istemcim 3 ondalık basamağa zaman damgasını saklıyordu ... sorgudan daha büyük bir performans gösterdiğinde, her zaman aynı kayda dönecekti ekstra 2 ondalık basamak nedeniyle. – JBlake

+1

Rails'de milisaniye desteği için daha doğal bir yol olmadığına şaşırdım. : -/ –

1

ISO8601 standardını kullanıyorsanız, .iso8601(10)'u kullanabilirsiniz. Nedenini bilmiyorum, ancak varsayılan olarak saniyelerce yuvarlanıyor.