2009-08-10 4 views
32

Rails war gut mit automatisch korrekt formatierten Datumsangaben in MySql eingefügt, ohne dass ich viel darüber nachdenken muss.Ruby datetime für mysql Vergleich geeignet

Um eine Validierung durchzuführen, muss ich jedoch überprüfen, ob ein gespeicherter mysql datetime Wert (dh 2008-07-02 18:00:00) größer oder kleiner als "now" ist. Ich kann DateTime.now oder Time.now anrufen, aber wie kann ich das in das Format mysql likes konvertieren?

Dank

Antwort

83

können Sie to_s(:db) verwenden, um in eine Datenbank freundliches Format zu konvertieren.

Time.now.to_s(:db) 

jedoch vorsichtig sein, wenn Sie eine Zeitzone angegeben in Rails haben, weil die Zeit wird in UTC in der Datenbank gespeichert werden. Sie müssen das angeben, um richtige Vergleiche zu machen.

Time.now.utc.to_s(:db) 

Sie können auch NOW() Funktion in MySQL verwenden, anstatt die aktuelle Uhrzeit in Ruby zu erzeugen.

+15

danke. Es ist großartig, wenn der Railscast-Typ deine Fragen beantwortet :) – user94154

+1

Das sollte wirklich eine Methode in Rails sein! – Hopstream

+0

100 danke. Diese Antwort erinnerte mich nur an die Existenz von NOW(). ActiveRecord hat mich sicher verwöhnt. Ich habe Time passiert. Jetzt, seit ich SQL kaum mehr angefasst habe. Vorbei sind die Tage der Hand-Tweaking SQL (zumindest für mich). – Swartz

5

Sie müssen nicht. Lassen Sie Rails die Arbeit für Sie tun:

Wenn Ihr Modell Widget ist dies alle Widgets finden, die in den letzten Tag erstellt wurden:

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

Rails automatisch den Zeitstempel in das richtige Format konvertieren.

+0

danke für die Antwort aber das passt nicht zu meinem Anwendungsfall. Ich habe mein Objekt bereits aus der Datenbank abgerufen. Lange nachdem es abgerufen wurde, muss ich eine zeitbasierte Validierung durchführen, sodass die Überprüfung in Ruby-Code und nicht in einer Abfrage erfolgen muss. Nochmals vielen Dank. – user94154

+0

Ich hatte ein anderes Szenario, und das hat perfekt funktioniert. Vielen Dank. – aronchick

+0

Verwenden Sie in Rails 4+ einfach 'Thing.where ('created_at>?', 6.months.ago)' –