代码之家  ›  专栏  ›  技术社区  ›  Trinity76

gem-ransack自定义搜索仅搜索年份而不是完整日期

  •  0
  • Trinity76  · 技术社区  · 7 年前

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

    如何传入自定义谓词,将输入值从完整日期(如2007-12-31)转换为仅年份?

    我要找的是一个与sql查询等价的搜索:

    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]
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   StandardNerd    7 年前

    使用洗劫机:

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

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

    另请参见使用 Ransacker on Ransack Wiki

        2
  •  2
  •   Will Mavis    7 年前

    看起来您可以使用作用域完成所需的结果。您可以看到我在这里创建的测试项目: 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,但是您可以根据需要将其更改为年份(完成日期)

    在视图中,我只使用名为finish_year的搜索字段:

      <%= f.label :finish_year %>
      <%= f.search_field :finish_year %>
    

    让我知道如果你有任何问题让它工作。