Ruby on Rails,Datepicker在两个日期之间搜索

时间:2016-05-19 00:39:16

标签: ruby-on-rails-4 datepicker ransack

我是一个新的ROR用户,试图实现一个DateTime选择器来选择搜索功能的日期。

我的问题是,当我在DatePicker中输入两个日期(日期和日期)时,我会从搜索中得到不一致的结果。有时候我没有得到任何结果,有时我会得到所有结果。我也在使用bootstrap-datepicker-rails gem以及ransack gem。

这就是我的观点

  <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。存储的日期是datetime,看起来像这样,

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 @Michael 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 个答案:

答案 0 :(得分: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 })