在我的应用程序上,我有一个名为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搜索上添加关系的正确方法吗?
谢谢
答案 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建议的方法结合使用,您应该从匹配的功能的文本查询和过滤器(如果需要的话)中获得结果。