2010-01-28 8 views
5

J'essaie de créer une requête qui va rechercher les entrées récentes basées sur la colonne 'last_login_at'. Ce champ est datetime avec le fuseau horaire (à savoir Time.zone.now) Lorsque j'exécuteRequête Ruby on Rails par intervalle datetime (dernières 24, 48, etc ... heures)

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

Je ne reçois rien.

Sinon je peux définir aujourd'hui comme hier Time.zone.today et que Time.zone.today - 1.day et exécuter

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

et il retourne encore 0 résultats. Je sais qu'il y a des entrées qui entrent dans cette catégorie.

Répondre

11

Assurez-vous que les fuseaux horaires que vous avez enregistrés dans la base de données et ceux que votre application rails affiche sont identiques. Cela peut parfois causer un problème. Sinon, essayez ce champ nommé:

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 

vous permettant de faire:

User.last_loggedin_before 24.hours.ago 

ou

User.last_loggedin_within 24.hours.ago 
+0

Il semble que les fuseaux horaires im comparer sont à la fois PST -08: 00, donc je m encore coincé là ... Les étendues nommées devraient fonctionner très bien! merci – Mike

+2

Cela fonctionne très bien, merci. Une note - named_scope a changé en 'scope' (je suis sur Rails 3.2.11). – Blake

17

question ancienne, mais voici plus récente syntaxe:

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