2009-08-10 9 views
32

Rails ha sido bueno con la inserción automática de fechas de formato formateadas en MySql sin la necesidad de que lo piense mucho.Ruby datetime adecuado para la comparación de mysql

Sin embargo, para hacer una validación, necesito verificar si un valor de fecha y hora de mysql almacenado (es decir, 2008-07-02 18:00:00) es mayor o menor que "ahora". Puedo llamar al DateTime.now o Time.now, pero ¿cómo puedo convertir eso en el formato que le gusta a mysql?

Gracias

Respuesta

83

Puede utilizar to_s(:db) a convertir en un formato fácil de base de datos.

Time.now.to_s(:db) 

Sin embargo, tenga cuidado si usted tiene una zona horaria especificada en Rails porque el tiempo será almacenado en UTC en la base de datos. Deberá especificar eso para hacer comparaciones adecuadas.

Time.now.utc.to_s(:db) 

También puede utilizar la función NOW() en MySQL en lugar de generar la hora actual en Ruby.

+15

gracias. Es increíble que el chico de Railscasts responda tus preguntas :) – user94154

+1

¡Esto realmente debería ser un método en los rieles! – Hopstream

+0

100 gracias. Esta respuesta me recordó la existencia de NOW(). ActiveRecord seguro me ha echado a perder. He pasado Time.now ya que apenas toco SQL. Atrás quedaron los días del SQL manual (al menos para mí). – Swartz

5

No es necesario. Deje que los carriles hacen el trabajo por usted:

Si su modelo es Widget esto va a encontrar todos los widgets que se han creado en el último día:

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

rieles convertirá automáticamente la fecha y hora en el formato correcto.

+0

gracias por la respuesta, pero esto no se ajusta a mi caso de uso. Ya tengo mi objeto recuperado de la base de datos. Mucho después de que se recupera, necesito ejecutar una validación basada en el tiempo para que la verificación se realice en el código de Ruby y no en una consulta. Gracias de nuevo. – user94154

+0

Tenía una situación diferente, y esto funcionó a la perfección. Gracias. – aronchick

+0

En Rails 4+ simplemente use 'Thing.where ('created_at>?', 6.months.ago)' –