【问题标题】:How to filter results inclusively (AND) with searchkick如何使用 searchkick 以包容性方式 (AND) 过滤结果
【发布时间】:2019-02-16 17:30:20
【问题描述】:

我有两个模型:WorkerSkill。 一个工人可以拥有多种技能。每个技能都有自己的名称(例如“php”、“web-development”等)

在我的搜索表单中,我希望能够根据他们的技能过滤工人(在 searchkick 的帮助下)。如果在表单中选择了多项技能,则搜索结果应仅包括那些拥有所有已选择技能的工人。


我尝试了以下方法:

worker.rb

has_many :worker_skills
has_many :skills, through: worker_skills

searchkick
scope :search_import, -> { includes(:skills) }

def search_data
  {
    skills_name: skills.pluck(:name)
  }
end

技能.rb

has_many :worker_skills
has_many :workers, through: :worker_skills

workers_controller.rb

def index
  ...
  @workers = Worker.search(
    params[:q],
    where: {
      skills_name: params[:skills]
    }
  end
  ...
end

这会返回至少拥有一项选定技能的所有工人。

示例:

Filters selected: ['php', 'ruby']
Result: All workers who either have 'php' - OR - 'ruby' as a skill.

我怎样才能实现只返回同时具有两种技能的工人?
即'php' - 和 - 'ruby'

【问题讨论】:

    标签: ruby-on-rails elasticsearch searchkick


    【解决方案1】:

    如果您看这里https://github.com/ankane/searchkick#querying,您可以使用all 参数,以便它必须与where 子句中的所有元素匹配。在您的 workers_controller.rb 中执行以下操作:

    def index
      ...
      @workers = Worker.search(
        params[:q],
        where: {
          skills_name: {
            all: params[:skills]
          }
        }
      end
      ...
    end
    

    还要记住确保您在params[:skills] 中有值。如果没有,你会得到一个 undefined method `each' for nil:NilClass 错误。所以可能会禁用搜索按钮,直到选择了一些值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-15
      • 1970-01-01
      • 1970-01-01
      • 2016-09-22
      • 1970-01-01
      相关资源
      最近更新 更多