【问题标题】:gem Ransack custom search for only Year instead of full dategem Ransack 自定义搜索仅年份而不是完整日期
【发布时间】:2018-06-08 12:17:33
【问题描述】:

我有一个 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]

【问题讨论】:

    标签: ruby-on-rails ransack


    【解决方案1】:

    使用 Ransacker:

    你可以在你的模型中这样写:

      ransacker :custom_years do |args|
        query = <<-SQL
          Year(finish_date)
        SQL
        Arel.sql(query)
      end
    

    参见Ransacker on Ransack Wiki

    【讨论】:

      【解决方案2】:

      看起来您可以使用作用域完成所需的结果。你可以在这里看到我创建的测试项目: 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 %>
      

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

      【讨论】:

      • 非常感谢您为回答和创建测试项目所做的努力。但是我已经有一个现有的表单(带有下拉属性),我不确定如何将您的解决方案集成到现有的表单中。
      猜你喜欢
      • 2018-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-25
      • 1970-01-01
      • 1970-01-01
      • 2016-09-11
      相关资源
      最近更新 更多