2012-10-08 44 views
10

Tengo un alcance que consulta las llamadas de hoy. Basado en el alcance lo uso para contar la cantidad de llamadas de hoy.Consultar el rango de fechas en los raíles

Mis fechas se almacenan en UTC pero los rieles se convierten en mi zona horaria local. Lo que intento hacer es encontrar todas las llamadas entre hoy a las 00:00 y 23:59.

Alcance:

scope :today, where("DATE(transfer_date) BETWEEN ? AND ?", Time.zone.now.utc.beginning_of_day, Time.zone.now.utc.end_of_day) 

salida IRB: (La llamada que las capturas debido a UTC)

irb(main):010:0> Call.last.transfer_date 
    Call Load (0.9ms) SELECT "calls".* FROM "calls" ORDER BY "calls"."id" DESC LIMIT 1 
=> Sun, 07 Oct 2012 19:45:00 CDT -05:00 
irb(main):011:0> 

irb(main):011:0> Call.last.transfer_date.utc 
    Call Load (1.3ms) SELECT "calls".* FROM "calls" ORDER BY "calls"."id" DESC LIMIT 1 
=> 2012-10-08 00:45:00 UTC 

Estoy tratando de encontrar la manera de consulta sólo las llamadas que estaban entre las 00:00 y 23:59 por hoy. Hasta ahora, intentar enfocar con y sin utc, zone, etc. no funciona. Sigue tirando del alcance basado en UTC que incluye la llamada de ayer (ayer si está formateado con la zona horaria local).

¿Cómo puedo consultar entre las dos veces para obtener la salida correcta? Estoy perdido aquí.

+0

puede por favor aclarar sus preguntas, por favor, significa qué modelo le dio alcance, y en el fondo usted no escribió hoy como alcance. –

Respuesta

7

que era capaz de compensar UTC reescribiendo mi alcance de la siguiente manera:

scope :today, where("transfer_date BETWEEN ? AND ?", Time.zone.now.beginning_of_day, Time.zone.now.end_of_day) 
13

Se puede utilizar una gama exclusiva.

scope :today, where(:transfer_date => Date.today...Date.tomorrow) 
0

Tal vez esto es una exageración, pero se recomienda usar un método de ayuda para conseguir el rango de tiempo y luego consultar la base de datos. Algo como

# Gets time range for x number timeunits ago 
    def time_range(unit, timeunit = nil) 
    if timeunit == "weeks" 
     now = Time.zone.now.beginning_of_week 
    elsif timeunit == "months" 
     now = Time.zone.now.beginning_of_month 
    else 
     now = Time.zone.now.beginning_of_day 
    end 
    # Ex: time_range(0, "days") --> Get the time range for today between the beginning of today and the beginning of tommorow - 1 second 
    now - unit.send(timeunit)..now + 1.send(timeunit) - 1.seconds - unit.send(timeunit) 
    end 

le ayudará a solicitar intervalos de tiempo. Entonces cuando solicitas algo como;

time_range(0, "days") 

devolverá el rango de tiempo de hace 0 días (hoy);

Wed, 07 Sep 2016 00:00:00 UTC +00:00..Wed, 07 Sep 2016 23:59:59 UTC +00:00 

Y luego puede simplemente consultar el objeto de la base de datos y contar todo dentro del rango;

Calls.where(transfer_date: time_range(unit, timeunit)).count 
+0

Esto es bueno, y gracias por el ejemplo, pero terminé yendo con un simple alcance lambda unos años atrás :) – nulltek

+0

¡No hay problema, hombre! Tal vez para uso futuro –

Cuestiones relacionadas