2010-01-28 1 views
5

Sto provando a creare una query che cercherà le voci recenti in base alla colonna 'last_login_at'. Questo è un campo datetime con fuso orario (cioè Time.zone.now) Quando eseguoquery Ruby on Rails per intervallo datetime (ultimi 24, 48, ecc.)

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

non ottengo niente.

In alternativa posso definire oggi come Time.zone.today e ieri come Time.zone.today - 1.day ed eseguire

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

e restituisce ancora 0 risultati. So che ci sono alcune voci che rientrano in questa categoria.

risposta

11

Assicurarsi che i fusi orari registrati nel database e quelli in uscita dall'app delle rotaie siano uguali. Questo a volte può causare un problema. In caso contrario, provare questo ambito denominato:

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 

che consente di fare:

User.last_loggedin_before 24.hours.ago 

o

User.last_loggedin_within 24.hours.ago 
+0

Sembra che i fusi orari di confronto sono entrambi PST -08: 00, quindi io m ancora bloccato lì ... Gli ambiti nominati dovrebbero funzionare alla grande! grazie – Mike

+2

Questo funziona benissimo, grazie. Una nota - named_scope è cambiata in "scope" (sono su Rails 3.2.11). – Blake

17

vecchia questione, ma ecco la sintassi più recente:

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