2011-03-29 8 views
3

내 응용 프로그램에서 사용자 has_many 제스처. 사용자가 제스처를 완료 한 후 다음 날을 계산하는 좋은 방법은 무엇입니까?일의 깨진 줄무늬를 계산하는 가장 좋은 방법

지금 나는 아래처럼 그것을하고 있으며, 내가 원하는대로 작동합니다. 그러나 그것은 분명히 비례하지 않습니다.

class User < ActiveRecord::Base 

    # ... 

    def calculate_current_streak 
    return 0 unless yesterday = gestures.done_on_day(Date.today-1) 
    i = 0 
    while gesture = self.gestures.done_on_day(Date.today - (i+1).days).first 
     i += 1 
    end 
    i += 1 if gestures.done_on_day(Date.today).first 
    i 
    end 

end 

고마워요! 단지 트랙 일에 방식으로 작동 할 수있는 일에 특별 포인트도 :

+0

db 테이블 구조에 대해 설명 할 수 있습니까? 각 제스처에 대한 레코드와 타임 스탬프가있는 제스처 테이블이 있습니까? – Elad

답변

2

그것에 대해 이런 식으로 생각 :

줄무늬의 길이가 경과 (사업) 일 수에 해당 사용자가 제스처를 전혀 사용하지 않은 마지막 (업무) 날, 맞습니까?

그래서이 솔루션은 사용자가 제스처를하지 않은 가장 최근 날짜를 계산하는 것으로 귀결됩니다.

많은 DB 관리자가 사용하는 속임수가 있습니다. 모두 (예 : 2000 년에서 2100 년까지의 모든 날짜)의 DB 테이블을 만듭니다. 테이블에는 날짜 필드 만 있어야하지만, 부울 필드를 던져 주말이나 휴일과 같은 휴무일을 표시 할 수 있습니다. 이러한 테이블은 개의 쿼리가 많이 사용되는에 편리 할 수 ​​있으며 한 번만 작성하여 채워야합니다. (Here's 더 자세한 MS SQL 용으로 작성 같은 테이블에 기사,하지만 통찰력 어쨌든.)

이 테이블 (의이 dates를 호출하자), 당신은 같은 것을 사용하여 사전 행진 날짜를 계산할 수를 갖는 (의사-SQL) :

SELECT d.date 
FROM dates d 
LEFT JOIN gestures g ON d.date = g.date AND g.user_id = <put_user_id_here> 
WHERE d.date < TODAY() AND g.date IS NULL AND d.work_day = TRUE 
ORDER BY d.date DESC 
LIMIT 1 
+0

흥미로운 트릭. 메모리에있는 캘린더 객체를 조작하는 것보다 낫지 만 쉽지 않은 것은 확실합니다. – Jean

관련 문제