Ruby Rails,日期选择器在两个日期之间搜索
Ruby on Rails, Datepicker search between two dates
我是一名 ROR 新用户,正在尝试为 select 日期实施日期时间选择器以实现搜索功能。
我的问题是,当我在 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。存储的日期是日期时间,看起来像这样,
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 是搜查 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 %>
谢谢。
您需要将表单中输入的字符串格式日期(通过 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 和格式化字符串值之间来回转换。
在您的 Sailing#search(params[:q])
示例中,您可以在 Sailing#search
中实施解决方案(如果您有权更改该代码)或在调用 Sailing.search
.[=23= 之前实施解决方案]
以下是您在 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 })
我是一名 ROR 新用户,正在尝试为 select 日期实施日期时间选择器以实现搜索功能。
我的问题是,当我在 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。存储的日期是日期时间,看起来像这样,
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 是搜查 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 %>
谢谢。
您需要将表单中输入的字符串格式日期(通过 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 和格式化字符串值之间来回转换。
在您的 Sailing#search(params[:q])
示例中,您可以在 Sailing#search
中实施解决方案(如果您有权更改该代码)或在调用 Sailing.search
.[=23= 之前实施解决方案]
以下是您在 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 })