gem Ransack自定义搜索只有Year而不是完整日期

时间:2018-06-08 12:17:34

标签: ruby-on-rails ransack

我有一个Rails 5.1应用程序和一个带有包含一些数据库列的下拉列表的Ransack搜索表单。其中一列是finish_date,其格式为“2007-12-31”。在输入字段中,我必须准确输入完整日期以获得匹配,但我想更改它仅接受年份作为输入值的行为。

如何传入自动转换输入值的自定义谓词,例如。 2007-12-31只到一年?

我正在寻找的是与sql查询等效的Ransack:

SELECT *
 FROM imagecapturing
 WHERE YEAR(finish_date) = 2007

我的Ransack表格:

<%= 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]

2 个答案:

答案 0 :(得分:2)

看起来您可以使用范围来完成所需的结果。你可以看到我在这里创建的测试项目: https://github.com/wmavis/so_rails_ransack

文档中有一个如何在此处使用范围的示例: https://github.com/activerecord-hackery/ransack/#using-scopesclass-methods

我在Imagecapturing模型中添加了以下内容:

  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 %>

如果您在使用它时遇到任何问题,请告诉我。

答案 1 :(得分:2)

使用Ransacker:

您可以在模型中编写类似的内容:

db = mysql.connector.connect(...)
cursor = db.cursor()
# Limit SELECTs to 1 second
cursor.execute("SET SESSION MAX_EXECUTION_TIME=1000")

另请参阅使用Ransacker on Ransack Wiki