2014-06-05 3 views
2

Result라는 모델이 있습니다. 특정 날짜 범위 사이에 들어오는 모든 결과를 반환하는 변수를 만들어야합니다. Result 모델에는 date라는 필드가 있으며 폼에 시작 및 종료 날짜를 매개 변수로 캡처하여 컨트롤러로 다시 전달합니다.두 날짜 매개 변수 사이의 루비 쿼리

그래서 사용자가 startdate 매개 변수에 '01/01/2014 '를 입력하고 매개 변수에 '01/01/2015'를 입력하면이 범위 사이의 모든 결과를 반환해야합니다.

사용자가 매개 변수가 결국은 "필터"버튼을 프레

변수는 STARTDATE으로 캡처 나는이 시도

종료 날짜하지만 그때 나는 보았다

@results = Result.where("date >= ? and date <= ?", startdate, enddate") 

을 작동하지 않습니다되고 결과 SQL 및이 필요가 있다고 생각

@results = Result.where("date >= ? and date <= ?", '#{startdate)', '#{enddate}') 

어떤 아이디어?

@results = Result.where(:date => startdate..enddate) 

그러나 사용하기 전에 쿼리

, startdateenddateDate 객체로 변환 할 필요가해야하기 때문에

감사

+2

날짜 입력 형식이 항상 고정되어 있습니까? –

답변

1

조언을 주신 모든 분들께 감사드립니다. 이것은 결국 나의 해결책이었다.

먼저, datepicker를 사용하여 유효한 날짜 만 양식에 입력 할 수있게하십시오.

$(function(){ 
    $('#startdate').datepicker({ 
     changeYear: true, 
     dateFormat:"dd/mm/yy", 
     defaultDate: "#{Date.today.day}/#{Date.today.month}/#{Date.today.year}", 
     change: function() { 
     var isoDate = this.getValue('yyyy-mm-dd'); 
     $(this).attr('data-value', isoDate); 
     } 
    }); 
$('#enddate').datepicker({ 
    changeYear: true, 
    dateFormat:"dd/mm/yy", 
    defaultDate: "#{Date.today.day}/#{Date.today.month}/#{Date.today.year}", 
    change: function() { 
    var isoDate = this.getValue('yyyy-mm-dd'); 
    $(this).attr('data-value', isoDate); 
    } 
    }); 
}); 


%form{:action => employee_results_path(@employee), :class => 'navbar-search pull-left'} 
    .field 
    %input{:type =>'text', :placeholder => params[:startdate] != nil ? params[:startdate] : "from date", :id => 'startdate', :name => "startdate", :style => 'width: 100px'} 
    %input{:type =>'text', :placeholder => params[:startdate] != nil ? params[:enddate] : "to date", :id => 'enddate', :name => "enddate", :style => 'width: 100px'} 

다음, 컨트롤러 캡처의 변수로 매개 변수와는

sdate = Date.parse(params[:startdate]) 
edate = Date.parse(params[:enddate]) 

그럼 내가 치료를했다이 질문에

@results = Result.where(:date => sdate..edate) 

에 받았다 유용한 솔루션을 사용하여 날짜로 구문 분석 . 모두 도와 주셔서 감사합니다!

+0

이 대답을 받아 들여서 문제가 해결되었습니다. – bronislav

0

당신은 쓸 수 있습니다. @ MrYoshiji도의 알 수 있듯이

+0

그게이 질문에 답하는 열쇠였습니다. 고마워요. –

1

, 당신은 이러한 시나리오에주의해야 한 것은 모두 당신의 startdateenddate 중 하나 Date, DateTime 또는 Time 객체가 있다는 것입니다. 그렇지 않으면 비교가 실패합니다.

1.) 바로 가기는 input 태그에 datepicker를 적용하는 것입니다. datepicker의 이니셜 라이저에는 specify the format을 사용할 수 있습니다.

2.) date/time tag rails form helper을 사용하십시오.

3) 정확한 형식을 보장하려면 regex을 사용하십시오. 이 모든 검증을 통과 할 때

는 그리고, 다음을 수행하십시오

@results = Result.where(date: Date.parse(startdate).beginning_of_day..Date.parse(enddate).end_of_day) 

또한 당신은 500 페이지로 이동하지 않도록하기 위해 마지막에 구조를 추가 할 수 있습니다. 쿼리의 끝에서

rescue Result.all (ALL-ELSE-FAILED의 경우)

을 추가하고이 시간대를 제대로 있는지 확인하십시오. postgresql의 기본값은 UTC입니다.

+1

위험합니다. Date.parse가 실패하면 오류가 발생합니다. – MrYoshiji

+0

그는 매개 변수의 형식이 '01/01/2014 '라고 말합니다. 그래서, 나는 이것이 효과가있을 것이라고 생각했습니다. –

+0

'그의 매개 변수는 매개 변수이기 때문에 모든 사용자가 "사용자의 입력을 신뢰하지 마십시오."라는 매개 변수를 전송한다는 의미입니다. 나는이'start_date = Date.parse (startdate) rescue Date.current'가 "date is parseed"라는 오류 메시지와 함께 최후에 구제받을 것이라고 생각한다. – MrYoshiji