首页 > 解决方案 > 在同一个 Bucket 中过滤两个数据 Searchkick Ruby on Rails

问题描述

我有下一个控制器动作:

  def index
    query                = params[:query].presence || "*"
    args                 = {}
    args[:name]          = params[:name]          if params[:name].present?
    args[:category_name] = params[:category_name] if params[:category_name].present?

    @items = Item.search query, where: args, aggs: { category_name: {} }
  end

我需要按名称和类别过滤(完成)

但是,我也需要按两个不同的类别进行过滤,例如:

category: "School", items: Notebook, Pencil, Pen, Board, etc

category: "Fruit", items: Banana, Pear, Grape, Apple, etc

category: "Vegetable", items: Broccoli, Carrots, Corn, Potatoes, etc

然后,用户选择“学校”和“水果”,结果应该是一个列表:

笔记本、铅笔、钢笔、白板等

香蕉、梨、葡萄、苹果等

目前我有几个不同的过滤器,我只是把“类别”来显示问题,我设法按所有过滤器过滤结果,但每个过滤器只过滤一次。

如何处理过滤器以允许对同一过滤器进行两次选择?

谢谢!

版本:

Rails 6.0.1

Ruby 2.6.5

Searchkick 4.1.1

标签: ruby-on-railsrubysearchkick

解决方案


您应该能够通过简单地将一组值传递给args[:category_name].

您可以设置搜索表单,以便params[:category_name]返回多个选择的数组,并且它应该可以正常工作。为了安全起见,我们可以在必要时将值强制转换为数组,如下所示:

args[:category_name] = Array(params[:category_name]) if params[:category_name].present?


推荐阅读