2014-06-05 65 views
2

我有一個名爲Result的模型。我需要創建一個變量,返回在某個日期範圍內出現的所有結果。在Result模型中有一個名爲date的字段,在表單上,​​我將捕獲開始日期和結束日期作爲參數並將它們傳遞迴控制器。兩個日期參數之間的紅寶石查詢

因此,如果用戶在startdate參數中輸入「01/01/2014」,並在參數中輸入「01/01/2015」,我需要返回日期在此範圍之間的所有結果。

當用戶按壓器一個「過濾器」按鈕參數最終被捕獲爲變量起始日期日期和結束日期

我試過,但它似乎沒有工作

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

然後我看着由此產生的SQL,並認爲它需要這個

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

任何想法?

感謝

+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

你可以寫爲

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

但在使用前查詢,startdateenddate必須要轉換爲Date對象。

+0

這是我回答這個問題的關鍵,謝謝。 –

1

正如@ MrYoshiji也建議,你應該小心在這種情況下的一件事是,無論你startdateenddate要麼DateDateTimeTime對象。否則,比較將失敗。

1.)快捷方式是將日期選擇器應用於您的input標記。您可以在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(在所有-ELSE失敗的情況下)

是,確保你得到正確的時區。 postgresql的默認值是UTC。

+1

這是有風險的,如果'Date.parse'失敗,則會引發錯誤 – MrYoshiji

+0

他說他的參數是'01/01/2014'的形式。所以,我認爲這會起作用。 –

+0

'他說他的參數'因爲它是一個參數,這意味着每個用戶都發送它:「永遠不要相信用戶的輸入」。我認爲這個'start_date = Date.parse(startdate)rescue Date.current'是最小的,最終通過一條錯誤消息說出「日期無法解析」 – MrYoshiji