2014-01-28 1 views
0

이벤트가 만료되면 사라지는 이벤트 목록 앱을 만들었습니다. 예를 들어, 사용자가 콘서트가 오후 9 시부 터 11 시까 지 1 월 28 일에 진행되는 것을 볼 수 있습니다. 1 월 28 일 오전 12 시부 터 오후 10시 59 분까지 해당 이벤트가 표시됩니다. 오후 11시에 행사가 끝났습니다.Rails에서 beginning_of_day 메소드를 4 시간 오프셋하는 방법

나이트 클럽은 1 월 28 일 오후 10 시부 터 1 월 29 일 오전 2 시까 지 유사한 이벤트를 가질 수 있습니다. 현재, 1 월 29 일 오전 12시에 나이트 클럽 행사는 여전히 활동 중이지만 사라집니다.

이벤트가 특정 날짜에 있는지 확인하지만 이른 아침 이벤트를 반환하지 않는 범위가 있습니다.

scope :on, lambda {|date| 
    raw_sql = '("event_occurrences"."start_time" BETWEEN ? AND ?) OR ("event_occurrences"."end_time" BETWEEN ? AND ?)' 
    scope = includes(:occurrences) 
    scope.where(raw_sql, date.beginning_of_day, date.end_of_day + 4.hours, date.beginning_of_day, date.end_of_day + 4.hours) 
} 

나는 날이 그 이후로 갈 수있는 더 좋은 방법이 될 것입니다 오전 4시보다는 자정에 시작되도록 정확하게 (일부 여유와) 밤 문화를 반영 beginning_of_day 및 END_OF_DAY 방법을 재정의 생각합니다.

사용자가 "오늘"과 "내일"에 대한 이벤트를 볼 수 있으므로 사용자 경험이 향상됩니다. 1 월 29 일 오전 1시에 "오늘"은 나이트 클럽을 표시하지만, 1 월 29 일 오후 9시에 시작하는 콘서트도 표시합니다. 이러한 콘서트는 "내일"으로 표시되어야합니다.

이러한 메서드를 재정의하는 유틸리티 클래스를 어떻게 만들 수 있습니까?

답변

1

기본적으로 주어진 날짜에 시작하여 주어진 날짜 시간 이후에 끝나는 모든 이벤트를 원합니다.

나는 날짜를 받게됩니다 같은 범위의 체인을 사용하고이 기준과 일치하는 레코드를 반환합니다 :

scope :active_on, ->(dt) { where("(start_time BETWEEN ? AND ?) OR (end_time BETWEEN ? AND ?)", dt.beginning_of_day, dt.end_of_day, dt.beginning_of_day, dt.end_of_day) } 
scope :active_for_datetime, ->(dt) { active_on(dt).where("end_time > ?", dt) } 

그런 다음 범위 .active_for_datetime(whenever)를 호출하고 지금 날짜 시간에 통과 할 수 있습니다, 또는 다른 특별한 순간.

beginning_of_day을 오전 4 시로 변경하는 것은 정신적입니다. 그러지 마.

+0

그러나 이것은 4 시간의 시간을 상쇄하지 않습니까? 'beginning_of_day'와'end_of_day' 체인에'+4hours'를 추가하면 오른쪽으로 응답하지 않습니다. – BHOLT

관련 문제