2009-08-10 27 views
32

Rails è stato buono con l'inserimento automatico di datetimes correttamente formattati in MySql senza che io debba pensarci molto.Ruby datetime adatto per il confronto mysql

Tuttavia, per eseguire una convalida, è necessario verificare se un valore MySQL memorizzato di MySQL (ovvero 2008-07-02 18:00:00) è maggiore o minore di "ora". Posso chiamare DateTime.now o Time.now ma come posso convertirlo nel formato mysql?

Grazie

risposta

83

È possibile utilizzare to_s(:db) per convertire in un formato amichevole di database.

Time.now.to_s(:db) 

Tuttavia, fare attenzione se si ha un fuso orario specificato in Rails perché il tempo sarà memorizzato in UTC nel database. Dovrai specificarlo per fare confronti appropriati.

Time.now.utc.to_s(:db) 

È possibile anche utilizzare NOW() funzione MySQL invece di generare l'ora attuale in rubino.

+15

grazie. è fantastico avere il tipo di railscast che risponde alle tue domande :) – user94154

+1

Questo dovrebbe essere davvero un metodo su binari! – Hopstream

+0

100 grazie. Questa risposta mi ha appena ricordato l'esistenza di NOW(). ActiveRecord ha sicuramente rovinato me. Ho passato Time.now da quando non tocco più SQL. Sono finiti i tempi di SQL-tweaking manuale (almeno per me). – Swartz

5

Non è necessario. Lasciate che Rails fare il lavoro per voi:

Se il modello è Widget questo troverà tutti i widget che sono stati creati negli ultimi giorni:

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

Rails convertirà automaticamente il timestamp nel formato corretto.

+0

grazie per la risposta, ma questo non si adatta al mio caso d'uso. Ho già recuperato il mio oggetto dal DB. Molto tempo dopo che è stato recuperato, ho bisogno di eseguire una convalida basata sul tempo su di esso in modo che il controllo deve essere fatto in codice Ruby e non in una query. Grazie ancora però. – user94154

+0

Ho avuto uno scenario diverso, e questo ha funzionato perfettamente. Grazie. – aronchick

+0

In Rails 4+ basta usare 'Thing.where ('created_at>?', 6.months.ago)' –