2010-01-28 6 views
5

'last_login_at'열을 기반으로 최근 항목을 검색하는 쿼리를 작성하려고합니다. 내가날짜/시간 범위 (지난 24 시간, 48 시간, 기타 ... 시간) 기준 Ruby on Rails 쿼리

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

을 실행 내가 아무 것도 얻을 수없는 경우이 시간대 (즉 Time.zone.now) 와 날짜 필드입니다.

또는 나는 Time.zone.today - 1.dayTime.zone.today 어제 같은 오늘을 정의하고

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

을 실행하고 여전히 0 결과를 반환 할 수 있습니다. 이 카테고리에 속하는 항목이 있다는 것을 알고 있습니다.

답변

11

데이터베이스에 기록한 시간대와 레일 앱이 출력하는 시간대가 동일한 지 확인하십시오. 이로 인해 때때로 문제가 발생할 수 있습니다. 당신이 할 수

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이므로 i 여전히 거기에 붙어있는 m ... 명명 된 범위는 훌륭하게 작동합니다. 덕분에 – Mike

+2

이것은 큰 감사합니다. 한 노트 - named_scope가 'scope'로 변경되었습니다 (레일 3.2.11). – Blake

17

오래된 질문을하지만, 여기에 새로운 구문입니다 :

User.where(last_login_at: 3.days.ago..DateTime.now) 
관련 문제