2016-09-24 6 views
-1

제 생각에 나는 start_time으로 항목 목록을 주문할 것입니다. 그러나 start_time의 오전 1시 (다음 날)가 start_time 오후 11:00 (전날) 이후로 표시되어야하는 경우가 있습니다. Time 데이터 유형은 2001-01-01의 기본 날짜를 저장하므로, 2001 년 1 월 2 일이 아닌 2001-01-01에 1:00 AM의 항목이 있다고 간주합니다.레일 - Time 데이터 유형의 기본 시간을 변경하십시오.

따라서 제 질문은 시간 데이터 유형의 기본 날짜를 변경하는 방법이 있습니까?

DateTime 데이터 유형에 시작 및 종료 시간을 저장하고 해당 날짜를 입력하는 것이 분명한 해결책이라고 가정합니다. 그러나이 응용 프로그램의 경우, 오전 1시의 시작 시간을 전날의 "속한"것으로 참조하는 것이 일반적이므로 다음 날을 입력하는 것이 혼란 스러울 수 있습니다. (예 : 금요일 밤에 가장 좋아하는 밴드의 콘서트에 참석할 때, 토요일 아침 12시 30 분에 음악 세트가 시작될 수 있지만 금요일 밤에는 콘서트가 열리는 것으로 간주합니다). 도와 줘서 고마워.

+1

당신은 당신이 데이터베이스에서이 정렬을 달성 할 수있는 방법을 원하는 나에게 제안한다 "PostgreSQL을"로이 태그했지만, 당신은 또한 루비'Time' 클래스에 대해 이야기하는 그 일에 관여하지 않았을 것입니다. DB 쿼리 또는 Ruby 코드로 정렬 하시겠습니까? –

+0

저는 아직 RoR에 비교적 새로운입니다. 나는 이것이 루비 코드 또는 DB 쿼리와 함께 처리 될지 여부를 확신하지 못했습니다. – ncarroll

답변

1

질문에 대한 직접적인 대답은 아니지만 가능한 해결책은 다음과 같습니다. < AM을 마지막으로 정렬하는 사용자 지정 정렬을 만들 수 있습니다.

sorted_concerts = Concert.order('CASE WHEN start_time <= "2001-01-01 01:00:00" THEN 2 ELSE 1 END, start_time') 

이렇게하면 db 열을 그대로 둘 수 있지만 예상되는 콘서트 순서를 얻을 수 있습니다. 이 1 AM 반전을 제외하고 시간은 일반적으로 오름차순으로 정렬됩니다.

+0

스티브 - 제안 해 주셔서 감사합니다. 그것은 확실히 좋은 시간에 주위에 좋은 작품입니다. 콘서트가 7/8에 끝나는 엣지의 경우가 있기 때문에 좀 더 영구적 인 해결책을 찾는 데 여전히 관심이 있습니다. 언젠가는 하루 일정으로 이론적으로 일찍 시작할 수 있습니다. – ncarroll

+0

아래의 제안 사항과 유사합니까? 다시 한번 감사드립니다. – ncarroll

0

훨씬 더 많은 연구가 끝난 후, Ruby가 Time 데이터 유형에 저장된 시간에 적용되는 "2001-01-01"의 기본 날짜가 조정될 수없는 것처럼 보입니다. 이 질문에 대한 답변을 내 생각 엔 -하지만 - 문제를 해결하기 위해 datetime datatype db 열을 변경하고 시간 항목이 자정 이후 인 경우 조정할 기본 날짜를 기록했습니다. 아래의 컨트롤러 조치 :

def create 
     start_time = DateTime.parse("#{run_of_show_item_params[:date]} #{run_of_show_item_params[:start_time]}") 
     end_time = DateTime.parse("#{run_of_show_item_params[:date]} #{run_of_show_item_params[:end_time]}") 

     @run_of_show_item = RunOfShowItem.new(run_of_show_item_params) 
     @run_of_show_item.start_time = start_time 
     @run_of_show_item.end_time = end_time 
     @run_of_show_item.start_time+=1.days if run_of_show_item_params[:start_time] < "07:00" 
     @run_of_show_item.end_time+=1.days if run_of_show_item_params[:start_time] < "07:00" 
    if @run_of_show_item.save 
     flash[:success] = "Performance added!" 
     redirect_to :back 
    else 
     render 'new' 
    end 
    end 
관련 문제