如何通过与Searchkick的关系进行搜索?

时间:2018-12-18 18:32:12

标签: ruby-on-rails elasticsearch searchkick

在我的应用程序上,我有一个名为Talent的实体,该实体可以具有许多才能。像这样:

#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]]

我希望,在我的搜寻提示上,我可以根据用户是否具有才能来进行搜索。因此,在此示例中,我希望如果在搜索中加入“ Scubacuba”,它会返回所有具有“ scubadiving.name.scuba dive”名称的人才。

我在人才模型中添加了此方法:

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
    }

但是,如果我搜索“ Scuba”一词,没有得到任何结果?

我在这里做错了什么?这是在searchkick搜索上添加关系的正确方法吗?

谢谢

2 个答案:

答案 0 :(得分:0)

您是否检查了talent_abilities.name返回的内容。我认为,如果您尝试从Rails控制台调用它,则会由于undefined method实际上是一个ActiveRecord集合而抛出诸如#<Property::ActiveRecord_Associations_CollectionProxy的{​​{1}} name'之类的错误。

要解决此问题,您可以尝试执行以下操作:

talent_abilities

答案 1 :(得分:0)

执行此操作的最佳方法在某种程度上取决于您计划实现搜索的方式。如果您仅执行文本查询,那么@mehedi提到的方法将起作用,尽管我也建议您在搜索数据中添加以下内容:

talent_ability_names: talent_abilities.pluck(:name)

这样,您将拥有一组名称,这意味着您可以将文本查询用于其他属性,然后按一个或多个能力进行过滤,例如

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

通过将此方法与@mehedi建议的方法结合使用,您应该从匹配的功能的文本查询和过滤器(如果需要的话)中获得结果。