Как искать по отношениям с Searchkick? - PullRequest
0 голосов
/ 18 декабря 2018

В моем приложении есть сущность под названием Талант, которая может иметь много талантов.Например:

#model/talent.rb
class Talent < ApplicationRecord
  searchkick
  has_many :talent_talent_abilities, dependent: :destroy
  has_many :talent_abilities, through: :talent_talent_abilities
  scope :search_import, -> { includes(:talent_type, :talent_abilities, :talent_talent_abilities, :talent_primary_equipments, :talent_interests) }

Так, например, если я захожу на консоль и выполняю:

 t.talent_abilities = 
      TalentAbility Load (11.7ms)  SELECT  "talent_abilities".* FROM "talent_abilities" INNER JOIN "talent_talent_abilities" ON "talent_abilities"."id" = "talent_talent_abilities"."talent_ability_id" WHERE "talent_talent_abilities"."talent_id" = $1 LIMIT $2  [["talent_id", 13], ["LIMIT", 11]]

Я хочу это, по моему поисковому запросу я могу искать, основываясь на том, что пользовательимеет или нет талантливую способность.Итак, в этом примере я хочу, чтобы, если я добавлял «Подводное плавание» в свой поиск, он возвращал все таланты, которые имеют talent_ability.name Подводное плавание ».

Я добавил этот метод в свою модель талантов:

def search_data
    {
      name: user.full_name,
      gender: gender,
      ethnicity: ethnicity,
      eye_color: eye_color,
      hair_color: hair_color,
      type: talent_type&.name,
      talent_ability: talent_abilities.name
    }

Но если я выполню поиск по слову "Подводное плавание", я не получу никаких результатов?

Что я здесь не так делаю? Это правильный способ добавить отношения напоиск searchkick?

Спасибо

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Лучший способ сделать это зависит от того, как вы планируете осуществлять поиск.Если вы выполняете только текстовый запрос, то подход, упомянутый @mehedi, будет работать, хотя я бы также рекомендовал добавить к вашим поисковым данным следующее:

talent_ability_names: talent_abilities.pluck(:name)

Таким образом, у вас будет массивимена, что означает, что вы можете использовать текстовый запрос для других атрибутов, а затем фильтровать по одной или нескольким способностям, например

Talent.search(params[:query], where: {talent_ability_names: Array(params[:abilities])})

. Комбинируя этот подход с предложенным @mehedi, вы должны получить результаты как изсоответствующий текстовый запрос для способности и из фильтра (если это то, что вам нужно).

0 голосов
/ 19 декабря 2018

Вы проверили, что talent_abilities.name вернуть.Я думаю, что если вы попытаетесь вызвать его из консоли rails, он выдаст ошибку типа undefined method name 'для #<Property::ActiveRecord_Associations_CollectionProxy, поскольку talent_abilities на самом деле является коллекцией ActiveRecord.

Чтобы решить эту проблему, вы можете попробовать что-то вроде этого:

talent_ability: talent_abilities.pluck(:name).join(' ')
...