2010-01-28 15 views
5

Estoy intentando crear una consulta que buscará entradas recientes basadas en la columna 'last_login_at'. Este es un campo de fecha y hora con la zona horaria (es decir Time.zone.now) Cuando ejecutoRuby on Rails consulta por rango de fecha y hora (últimas 24, 48, etc ... horas)

User.find(:all, :conditions => ["last_login_at < ?", 24.hours.ago]) 

no consigo nada.

Alternativamente puedo definir hoy como Time.zone.today y ayer como Time.zone.today - 1.day y ejecutar

User.find(:all, :conditions => ["last_login_at between ? and ?", today, yesterday]) 

y todavía devuelve 0 resultados. Sé que hay algunas entradas que entran en esta categoría.

Respuesta

11

Asegúrese de que las zonas horarias que ha grabado en la base de datos y las que está entregando su aplicación de rieles son iguales. Esto a veces puede causar un problema. De lo contrario probar este ámbito con nombre:

class User < ActiveRecord::Base 
    named_scope :last_loggedin_before, lambda { |time_ago| { :conditions => ['last_login_at < ?', time_ago] } } 
    named_scope :last_loggedin_within, lambda { |time_ago| { :conditions => ['last_login_at > ?', time_ago] } } 
end 

que le permite hacer:

User.last_loggedin_before 24.hours.ago 

o

User.last_loggedin_within 24.hours.ago 
+0

Parece que las zonas horarias que comparo son ambas PST -08: 00, entonces m todavía está atrapado allí ... ¡Los ámbitos nombrados deberían funcionar muy bien! gracias – Mike

+2

Esto funciona genial, gracias. Una nota: named_scope ha cambiado a solo 'scope' (I'm on Rails 3.2.11). – Blake

17

vieja pregunta, pero aquí es más nueva sintaxis:

User.where(last_login_at: 3.days.ago..DateTime.now) 
Cuestiones relacionadas