2010-01-28 69 views
5

我試圖建立一個查詢,它將根據列'last_login_at'搜索最近的條目。這是時區(即Time.zone.now) 時間字段當我執行Ruby on Rails查詢日期時間範圍(過去24,48等...小時)

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

我什麼也沒得到。

或者今天我可以定義爲Time.zone.today和昨日Time.zone.today - 1.day 和運行

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

,它仍然返回0的結果。我知道有一些條目屬於這一類。

回答

11

確保您在數據庫中記錄的時區和您的rails應用程序輸出的時區相同。這有時會導致問題。否則試試這個命名範圍:

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 

讓你做:

User.last_loggedin_before 24.hours.ago 

User.last_loggedin_within 24.hours.ago 
+0

看來,即時比較的時區是PST -08:00,所以我米仍然卡在那裏... 命名的範圍應該很好!謝謝 – Mike 2010-01-29 05:18:28

+2

這很好,謝謝。一個音符 - named_scope已經變成了'範圍'(我在Rails 3.2.11上)。 – Blake 2013-03-08 17:12:38

17

老問題,但這裏的新語法:

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