【问题标题】:How to search by a relationship with Searchkick?如何通过与 Searchkick 的关系进行搜索?
【发布时间】:2018-12-18 18:32:12
【问题描述】:

在我的应用程序中,我有一个名为 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]]

我想要这样,在我的 searchkick 上,我可以根据用户是否有才能进行搜索。所以,在这个例子中,我希望如果我把“水肺潜水”放在我的搜索中,它会返回所有具有“水肺潜水”的 Talent_ability.name 的人才。

我将此方法添加到我的 Talent 模型中:

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 搜索中添加关系的正确方法吗?

谢谢

【问题讨论】:

    标签: ruby-on-rails elasticsearch searchkick


    【解决方案1】:

    您是否检查过talent_abilities.name 返回的内容。我想如果你尝试从 Rails 控制台调用它,它会抛出类似 undefined methodname' for #&lt;Property::ActiveRecord_Associations_CollectionProxy 的错误,因为 talent_abilities 实际上是一个 ActiveRecord 集合。

    要解决这个问题,您可以尝试以下方法:

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

    【讨论】:

      【解决方案2】:

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

      talent_ability_names: talent_abilities.pluck(:name)
      

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

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

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

      【讨论】:

        猜你喜欢
        • 2015-11-28
        • 2019-05-21
        • 2015-05-12
        • 2018-05-27
        • 2016-01-08
        • 2014-07-17
        • 1970-01-01
        • 2019-04-22
        • 1970-01-01
        相关资源
        最近更新 更多