2016-05-19 29 views
2

私は、検索機能の日付を選択するためのDateTimeピッカーを実装しようとしている新しいRORユーザーです。Ruby on Rails、2つの日付間の日付ピッカー検索

私の問題は、DatePickerに2つの日付(日付、日付、および日付)を入力すると、検索結果に一貫性がないことです。時には結果が得られないこともあり、結果がすべて得られることもあります。私もbootstrap-datepicker-railsの宝石とransackの宝石を使用しています。

これが私の見解は、私が参照しています2つのデータベース列がDEPARTURE_DATE、およびRETURN_DATEある

<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 
2016-08-07 00:00:00.000000 

return_date 
2016-08-14 00:00:00.000000 

私はDatePickersで2016年8月6日と2016年8月15日を入力して、私はすべての結果が返されています。

私の検索フォームDatePickerは、データベースのDateTimeと正しく比較できないデータを送信していますか?

私は 'gteq'と 'lteq'呼び出しを正しく使用していますか?

EDIT#1 @Michael Gaskill、問題が日付の書式であることは間違いありません。手動で日付を入力すると、正しい検索結果が得られます。私はちょうどコントローラに渡される前にフォーマットを修正する方法を理解する必要があります。

私のコントローラは次のようになります。

class HomeController < ApplicationController 

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

ここには、セーリングのコンテンツを生成する私のビュー内の完全なコードがあります。私はsearch_for_forを使用していますが、これは豪華な宝石の一部です。

<%= 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と書式設定されたString値の間で前後に変換するために使用されます。

お客様の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

お返事ありがとうございます!ここで私が働いているクエリです。 search = Sailing.search(params [:q])は私のクエリです。私はここにデータを渡していますsailings = search.result。コントローラーまたはビューの書式を変更する必要はありますか? – Aptorian

+0

コントローラ内。私は 'Sailing#search'に関連してあなたがそれをどうやって行うのかの例をいくつか挙げて答えを更新しました。 –

+0

ご返信ありがとうございます。現時点では動作しないようですが、明日にもう一度試してみます。乾杯。 – Aptorian

関連する問題