2011-07-03 12 views
13

así que estoy tratando de hacer las cosas de esta manera:Al comparar una fecha con la fecha y hora en created_at rails3

today = Date.today - 1 
todaysReport = Report.where(:created_at => today).find_by_user_id(user.id) 

El problema es created_at es una fecha y hora, para que no se encuentra ninguna sugerencia matches..Any ?

+0

postgres en heroku – Elliot

+1

'Date.today - 1' evaluará a * * ayer. Elimine el '-1' o cambie las tres instancias de" hoy "a" ayer " –

Respuesta

20

es probable que desee algo como esto:

yesterday = Time.now - 1.day 
user = User.find(user_id) 

todaysReport = user.reports.where(["created_at >= ? AND created_at <= ?", yesterday.beginning_of_day, yesterday.end_of_day]) 
+0

Es una solución, pero una mala ... –

+0

He actualizado mi respuesta. – Dex

+0

hmm ... mejor :) –

-4

¿Ha intentado utilizar #to_datetime, que los carriles se suma a las clases Date y Time?

Report.where(:created_at => today.to_datetime).find_by_user_id(user.id) 

Realmente sorprendido AR no lo hace por usted.

+0

¿No estaría tratando de coincidir en un momento en el que solo estoy tratando de hacer coincidir el día? – Elliot

+0

El único problema con esto es que probablemente realmente quiere un rango, por lo que no funciona. AR no debería generar un error como lo tiene ahora. – Dex

+0

Ah, sí, veo el problema. – d11wtq

5

Necesita comparar con un rango de una medianoche a la siguiente. Además, este es un buen candidato para hacer su propio método de clase para una mayor flexibilidad.

class Report 
    # All reports created on the specified Date 
    def self.created_on(date) 
    where(['created_at >= ? AND created_at < ?', date, date + 1]) 
    end 
end 

# Find all reports created yesterday by our user 
Report.created_on(Date.today - 1).where(:user_id => user.id) 
+0

¡Me gusta esto! Debería agregar beginning_of_day y end_of_day a la fecha var, ¿verdad? – Elliot

+0

@Elliot: No es necesario. Las fechas se convertirán a datetimes con la parte de hora configurada a medianoche detrás de las escenas. –

1

También puede ser TimeWithZone si la zona de tiempo especificado en la configuración de la aplicación. Para configurar Date to TimeWithZone tienes que hacer clic en Date.today.to_time.in_time_zone.

Cuestiones relacionadas