gem Ransack 自定义搜索仅搜索年份而非完整日期
gem Ransack custom search for only Year instead of full date
我有一个 Rails 5.1 应用程序和一个带有包含一些数据库列的下拉列表的 Ransack 搜索表单。其中一列是 finish_date 并且具有格式为“2007-12-31”的值。在输入字段中,我必须准确键入完整日期才能获得匹配项,但我想更改它仅接受年份作为输入值的行为。
我如何传递一个自定义谓词来转换来自完整日期的输入值,例如。 2007-12-31 到只有年?
我正在寻找的是 sql 查询的 Ransack 等价物:
SELECT *
FROM imagecapturing
WHERE YEAR(finish_date) = 2007
我的搜查表格:
<%= search_form_for @search do |f| %>
<%= f.grouping_fields(f.object.new_grouping) do |g| %>
<%= g.condition_fields(g.object.new_condition) do |c| %>
<%= c.predicate_select only: %i(cont not_eq eq) %>
<%= c.value_fields do |v| %>
<%= v.text_field :value %>
<% end %>
<% end %>
<% end %>
<%= f.submit "filter" %>
<% end %>
在我的控制器中:
@search = Imagecapturing.ransack params[:q]
@imagecapturings = @search.result.page params[:page]
看来您可以使用作用域完成所需的结果。你可以在这里看到我创建的测试项目:
https://github.com/wmavis/so_rails_ransack
文档在此处提供了如何使用范围的示例:
https://github.com/activerecord-hackery/ransack/#using-scopesclass-methods
我将以下内容添加到我的图像捕捉模型中:
def self.finish_year(year)
where("strftime('%Y', finish_date) = ?", year)
end
def self.ransackable_scopes(auth_object = nil)
%i(finish_year)
end
(我不得不使用 strftime,因为我的测试项目使用的是 sqlite,但您可以根据需要将其更改为 YEAR(finish_date))
在视图中,我只使用名为 finish_year:
的搜索字段
<%= f.label :finish_year %>
<%= f.search_field :finish_year %>
如果您在运行时遇到任何问题,请告诉我。
使用 Ransacker:
你可以在你的模型中写这样的东西:
ransacker :custom_years do |args|
query = <<-SQL
Year(finish_date)
SQL
Arel.sql(query)
end
另请参阅使用 Ransacker on Ransack Wiki
我有一个 Rails 5.1 应用程序和一个带有包含一些数据库列的下拉列表的 Ransack 搜索表单。其中一列是 finish_date 并且具有格式为“2007-12-31”的值。在输入字段中,我必须准确键入完整日期才能获得匹配项,但我想更改它仅接受年份作为输入值的行为。
我如何传递一个自定义谓词来转换来自完整日期的输入值,例如。 2007-12-31 到只有年?
我正在寻找的是 sql 查询的 Ransack 等价物:
SELECT *
FROM imagecapturing
WHERE YEAR(finish_date) = 2007
我的搜查表格:
<%= search_form_for @search do |f| %>
<%= f.grouping_fields(f.object.new_grouping) do |g| %>
<%= g.condition_fields(g.object.new_condition) do |c| %>
<%= c.predicate_select only: %i(cont not_eq eq) %>
<%= c.value_fields do |v| %>
<%= v.text_field :value %>
<% end %>
<% end %>
<% end %>
<%= f.submit "filter" %>
<% end %>
在我的控制器中:
@search = Imagecapturing.ransack params[:q]
@imagecapturings = @search.result.page params[:page]
看来您可以使用作用域完成所需的结果。你可以在这里看到我创建的测试项目: https://github.com/wmavis/so_rails_ransack
文档在此处提供了如何使用范围的示例: https://github.com/activerecord-hackery/ransack/#using-scopesclass-methods
我将以下内容添加到我的图像捕捉模型中:
def self.finish_year(year)
where("strftime('%Y', finish_date) = ?", year)
end
def self.ransackable_scopes(auth_object = nil)
%i(finish_year)
end
(我不得不使用 strftime,因为我的测试项目使用的是 sqlite,但您可以根据需要将其更改为 YEAR(finish_date))
在视图中,我只使用名为 finish_year:
的搜索字段 <%= f.label :finish_year %>
<%= f.search_field :finish_year %>
如果您在运行时遇到任何问题,请告诉我。
使用 Ransacker:
你可以在你的模型中写这样的东西:
ransacker :custom_years do |args|
query = <<-SQL
Year(finish_date)
SQL
Arel.sql(query)
end
另请参阅使用 Ransacker on Ransack Wiki