Как отфильтровать результаты включительно (И) с помощью searchkick

У меня две модели: Worker и Skill. У работника может быть несколько навыков. Каждый навык имеет свое название (например, «php», «веб-разработка» и т. д.)

В моей форме поиска я хочу иметь возможность фильтровать работников (с помощью 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' - И - 'рубин'


person sonnypgs    schedule 16.02.2019    source источник


Ответы (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. Так что, возможно, отключите кнопку поиска, пока не будут выбраны некоторые значения.

person ronatory    schedule 16.02.2019