我是一个新的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 %>
感谢。
答案 0 :(得分:1)
您需要将表单中输入的字符串格式日期(通过DatePicker或手动输入)转换为Date或DateTime值。查询数据库时,请使用此DateTime#strptime
转换:
MyTable.where(date_field_to_search: DateTime.strptime(date_value_from_ui, "%F %T")
您可以使用DateTime:strftime上的说明查看可用作strptime
的第二个参数的格式。请注意,strftime
和strptime
用于在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 })