2009-10-05 5 views
0

다음 상황을 처리하는 가장 좋은 방법은 무엇입니까?행 기반 시간대 2.3.4

"이벤트"를 만드는 "관리자"가 있습니다. 이러한 이벤트는 전국적으로, 즉 다른 시간대가 될 수 있습니다. 현재 현재 미국 표준 시간대 목록이있는 선택 메뉴가 있습니다. 데이터베이스 테이블에는 선택한 시간대에 해당하는 열이 있습니다. 이것은 관리자가 5PM Eastern, 5PM Pacific 등을 선택할 수 있도록하기위한 것입니다.

응용 프로그램은 environment.rb 파일에 따라 UTC를 기본 표준 시간대로 사용합니다.

관리자가 "동부 표준시 (US & 캐나다)"를 선택하면 선택한 날짜 스탬프가 UTC (또는 앱 기본값)로 저장됩니다. 시간대를 포함하여 위에서 선택한 시간 전에 이벤트가 표시되지 않는 쿼리를 수행해야합니다.

이벤트에 자체 시간대가 필요하므로 데이터를 어떻게 저장해야합니까? 나는 원래 값을 저장하기 전에 레일즈를 속일 필요가 있다고 생각했기 때문에 시간대에 대한 UTC 오프셋을 저장합니다.

이것은 before_save 및 after_find 모델 메소드에서 처리됩니다. 하지만 작동하지 않는 것, 아니면 뭔가를 놓치고있는 것 같습니다.

답변

1

간단한 사실을 놓치 셨습니다. 시간은 보편적입니다. 오후 1시 (UTC)는 오후 1시 (UTC)입니다. 모든 이벤트와 함께 time_zone을 저장할 필요조차 없습니다. 관리자가보다 쉽게 ​​입력 할 수 있도록 관리자 만 선택할 수 있습니다. 백엔드까지는 항상 UTC입니다. 다른 시간대에서 시간을 입력하고 다른 시간대로 출력 할 수는 있지만, "런던에서 오후 1:00"과 동일합니다. 따라서 사용자가 이벤트를보고있을 때 간단히 event_date < Time.now.utc (모든 과거 이벤트)를 수행 할 수 있습니다.

그러나 관찰 사용자가 실제로 이벤트와 다른 시간대에 있고 사용자의 집 시간대에 이벤트 날짜를 표시하려는 경우 사용자가 집 시간대를 선택하여 사용자 테이블에 저장할 수 있습니다. 그런 다음에 before_filterApplicationController 당신이 단지 수 있습니다

class ApplicationController < ActionController::Base 
    before_filter :set_time_zone 

    private 
    def set_time_zone 
    Time.zone = current_user.time_zone if current_user 
    end 
end 

그런 다음 (예 : event.date 등) 데이터베이스에서 나오는 모든 시간 값은 자동으로 사용자의 홈 시간대로 변환됩니다.

아니면 질문에 잘못 이해했습니다. :)) 나에게 알려줘.