2012-09-07 6 views
1

오늘 전이나 후에 특정 일 수를 작성한 항목을 찾을 수 있기를 원합니다. 타임 스탬프가 포함 된 모델이 있습니다. 데이터베이스에는 약 70,000 개의 레코드가 있으므로 .all.each를 실행하는 데 상당히 오래 걸립니다.타임 스탬프에 대해 쿼리를 수행하는 방법은 무엇입니까?

내가 좋아하는 뭔가를 기대했다

Model.find_by_updated_at(Date.today - 1) 

그것은 그 updated_at 실제로 수업 시간을 반환하지만 것,하지 날짜; 이 분, 초에 이르기까지 정확한 때문에 내 요청은 특정 일에 변경 모델을 찾으려면 때문에, 나는

Model.find_by_updated_at(Time.now + 10000) # ten thousand seconds 

처럼 뭔가를 할 수 없습니다.

찾기를 사용하여이를 수행 할 수있는 방법이 있습니까?

필자는 find를 사용하는 대신 내 자신의 SQL 쿼리를 작성할 수 있다고 생각하지만 hh : mm : ss를 통해 검색을 제외하고 구성하는 방법을 잘 모르겠습니다.

답변

2

검색어는 매우 특정한 시간에 생성 된 모델을 찾고 있습니다. 범위

Model.where('updated_at>=?', Date.today - 1) 

아니면 :

Model.where('updated_at BETWEEN ? AND ?', Date.today - 1, Date.today) 

이 작업을 수행하는 방법은 여러 가지가있다 당신이 할 수 있습니다 것은 특정 시간 이후에 만들어진 물건을 돌려 무언가이다. 이 작업을 자주 수행하는 경우 색인 생성이 가능한 DATE 열을 만드는 것이 더 빠릅니다.

Model.where('DATE(updated_at)=?', Date.today - 1) 

그것은 자신의 쿼리를 작성에 의존하지 않고도 액티브 측면에서 원하는 것을 표현하기 위해 거의 항상 가능 :

대안처럼 동적으로 그것을 할 것입니다. 사실, 코드를 유지 관리 할 수있는 아주 좋은 이유가 없다면 피하는 것이 가장 좋습니다.

"하루"는 기껏해야 다소 퍼지 개념입니다. 필요한 UTC 시간에 데이터를 저장하는 경우 시작 및 종료 시간을 조정해야합니다. 그렇지 않으면 UTC 00:00:00을 일의 시작으로 사용하게됩니다. 이것은 당신의 기대치와 일치하지 않을 수도 있습니다.

당신은 다음과 같습니다 모델의 방법을 만들 수
1

:

다음
def self.updated_on_date(date) 
    where('updated_at BETWEEN ? AND ?', date.beginning_of_day, date.end_of_day) 
end 

Model.updated_on_date(Date.today-1) 
과 같이 호출 할 수 있습니다
관련 문제