Как отфильтровать результаты включительно (И) с помощью searchkick - PullRequest
0 голосов
/ 16 февраля 2019

У меня есть две модели: 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

worker_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 голосов
/ 17 февраля 2019

Если вы посмотрите здесь https://github.com/ankane/searchkick#querying, вы можете использовать параметр all, чтобы он совпадал со всеми элементами в предложении where.Выполните следующие действия в вашем worker_controller.rb :

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

Также имейте в виду, что у вас есть значения в params[:skills].Если нет, вы получаете неопределенный метод `each 'для nil: NilClass Ошибка.Поэтому, возможно, отключите кнопку поиска, пока не будут выбраны некоторые значения.

...