2009-08-10 10 views
32

Rails był dobry z automatycznym wstawianiem poprawnie sformatowanych datetimes w MySql bez potrzeby mnie zastanowić.Ruby datetime odpowiednie do porównania mysql

Jednak w celu sprawdzenia poprawności, należy sprawdzić, czy przechowywana wartość datetime mysql (np. 2008-07-02 18:00:00) jest większa lub mniejsza niż "teraz". Mogę zadzwonić pod numer DateTime.now lub Time.now, ale jak mogę to przekonwertować na format mysql lubi?

Dzięki

Odpowiedz

83

Można użyć to_s(:db) skonwertować do bazy danych przyjaznego formatu.

Time.now.to_s(:db) 

Należy jednak zachować ostrożność, jeśli strefa czasowa jest określona w Railsach, ponieważ czas będzie przechowywany w UTC w bazie danych. Musisz to określić, aby przeprowadzić odpowiednie porównania.

Time.now.utc.to_s(:db) 

Można również użyć NOW() funkcję w MySQL zamiast generowania aktualny czas w Ruby.

+15

dzięki. to niesamowite, że facet z railscastami odpowie na twoje pytania :) – user94154

+1

To naprawdę powinna być metoda na szynach! – Hopstream

+0

100 dzięki. Ta odpowiedź przypomniała mi o istnieniu NOW(). ActiveRecord z pewnością mnie zepsuł. Przekazywałem Time.now, ponieważ już prawie nie dotykam SQL. Minęły czasy ręcznego modyfikowania kodu SQL (przynajmniej dla mnie). – Swartz

5

Nie musisz. Niech Szyny do pracy dla Ciebie:

Jeśli model jest Widget będzie znaleźć wszystkie widżety, które zostały utworzone w ostatnim dniu:

Thing.find(:all, :condition => ["created_at > ?", Time.now - 1.day]) 

Szyny automatycznie konwertować znacznik czasu w odpowiednim formacie.

+0

dzięki za odpowiedź, ale to nie pasuje do mojego przypadku użycia. Mam już pobrany mój obiekt z DB. Długo po jego pobraniu, muszę uruchomić na nim walidację opartą na czasie, więc sprawdzenie musi być wykonane w kodzie Ruby, a nie w zapytaniu. Jeszcze raz dziękuję. – user94154

+0

Miałem inny scenariusz, który działał idealnie. Dzięki. – aronchick

+0

W Railsach 4+ po prostu użyj 'Thing.where ('created_at>?', 6.months.ago)' –