如何使用SearchKick全面过滤结果(AND)

时间:2019-02-16 17:30:21

标签: ruby-on-rails elasticsearch searchkick

我有两个模型: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

skill.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'-AND-'ruby'

1 个答案:

答案 0 :(得分: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]中具有值。如果没有,您将得到nil:NilClass 错误的未定义方法'each'。因此,可以禁用搜索按钮,直到选择了一些值。