2016-05-19 88 views
2

我是一個新的ROR用戶,試圖實現一個DateTime選擇器來選擇搜索功能的日期。Ruby on Rails,Datepicker在兩個日期之間搜索

我的問題是,當我在DatePicker中輸入兩個日期(日期從和日期到)時,我得到的搜索結果不一致。有時我得不到結果,有時我會得到所有結果。我也使用bootstrap-datepicker-rails寶石以及ransack寶石。

這是我的看法是什麼樣子

<div class="field"> 
    <%= f.label :departure_date_gteq, "Departure Date Between" %> 
    <%= f.search_field :departure_date_gteq, "data-provide" => "datepicker" %> 
    <%= f.label :return_date_lteq, "and" %> 
    <%= f.search_field :return_date_lteq, "data-provide" => "datepicker" %> 
    </div> 

兩個數據庫列我引用是DEPARTURE_DATE出發,RETURN_DATE和。存儲的日期是日期時間,看起來像這樣,

departure_date 
2016-08-07 00:00:00.000000 

return_date 
2016-08-14 00:00:00.000000 

我在DatePickers中輸入2016-08-06和2016-08-15,並且返回了所有結果。

我的搜索表單DatePicker可以發送無法正確比較數據庫中的DateTime的數據嗎?

我是否正確使用'gteq'和'lteq'調用?

編輯#1 @邁克爾Gaskill,你是正確的,問題是日期格式。當我手動輸入日期時,我會得到正確的搜索結果。我只需要弄清楚如何在傳遞給控制器​​之前更正格式。

這是我的控制器的樣子。

class HomeController < ApplicationController 

    def index 
    @search = Sailing.search(params[:q]) 
    @sailings = @search.result 
    ... Other calls ... 
    end 
end 

下面是我的視圖中生成航行內容的完整代碼。請注意,我正在使用search_for_for,它是ransack gem的一部分。

<%= search_form_for @search, url: root_path, method: :post do |f| %> 
      <div class="field"> 
      <%= f.label :cruise_ship_name_or_cruise_ship_company_or_destination_identifier_cont, "Cruise Ship Name" %> 
      <%= f.text_field :cruise_ship_name_or_cruise_ship_company_or_destination_identifier_cont %> 
      </div> 
      <div class="field"> 
      <%= f.label :departure_date_gteq, "Departure Date Between" %> 
      <%= f.search_field :departure_date_gteq, "data-provide" => "datepicker" %> 
      <%= f.label :return_date_lteq, "and" %> 
      <%= f.search_field :return_date_lteq, "data-provide" => "datepicker" %> 
      </div> 
      <div class="actions"><%= f.submit "Search" %></div> 
     <% end %> 

謝謝。

回答

1

您需要將表單中輸入的字符串格式的日期(通過DatePicker或手動輸入)轉換爲Date或DateTime值。當你查詢數據庫,使用此DateTime#strptime轉換:

MyTable.where(date_field_to_search: DateTime.strptime(date_value_from_ui, "%F %T") 

您可以在DateTime:strftime檢查可作爲第二個參數的格式strptime,使用說明書。請注意,strftimestrptime用於在DateTime和格式化的字符串值之間來回轉換。

在您的Sailing#search(params[:q])示例中,您可以在Sailing#search(如果您有權更改該代碼)或在致電Sailing.search之前實施該解決方案。

下面是你可能在Sailing#search實現這個:

class Sailing 
    def search(args) 
    datetime = args[:date_field_to_search] 
    if datetime.kind_of?(String) 
     datetime = DateTime.strptime(datetime, "%F %T") 
    end 
    # other search functionality 
    end 
end 

,或者致電Sailing#search之前:

datetime = params[:q][:date_field_to_search] 
if datetime.kind_of?(String) 
    datetime = DateTime.strptime(datetime, "%F %T") 
end 
Sailing.search(params[:q].merge({ date_field_to_search: datetime }) 
+0

謝謝您的回覆!這是我正在處理的查詢。搜索= Sailing.search(params [:q])是我的查詢。我在這裏將數據傳遞給視圖sailings = search.result。我是否需要更改控制器或視圖中的格式? – Aptorian

+0

在控制器中。我用幾個例子說明了你如何處理'Sailing#search'。 –

+0

嗯,感謝您的回覆。目前我似乎無法做到這一點,但明天我會再試一次。乾杯。 – Aptorian