在 RoR、ElasticSearch 和 Searchkick 中搜索 belongs_to 关联
Search in belongs_to association in RoR, ElasticSearch with Searchkick
我有两个模型:
class Venue < ActiveRecord::Base
has_many :loyalty_cards
end
class LoyaltyCard < ActiveRecord::Base
belongs_to :venue
searchkick word_start: [:venue_name, :venue_name_from_relation]
def search_data
attributes.merge(
venue_name_from_relation: self.venue(&:name)
)
end
end
LoyaltyCard 有两个字段:
venue_id: int #used for relation with venue if such venue exists
venue_name: string #or you can add venue name manually when creating loyalty card
我想搜索这两个字段并尝试按照 GitHub 的 Searchkick isses 中的建议进行以下调整(即 https://github.com/ankane/searchkick/issues/112):
searchkick word_start: [:venue_name, :venue_name_from_relation]
def search_data
attributes.merge(
venue_name_from_relation: self.venue(&:name)
)
end
它搜索 venue_name 成功,但是没有在关联的地点。
我还尝试执行以下操作(以及其他一些变体):
def search_data
{
venue_name_from_relation: venue.map(&:name)
}
end
但是重新索引失败并出现 nil class 错误。
有什么想法吗?
谢谢,
罗马
正确获取场地名称,因为它是 belongs_to
协会而不是 has_many
def search_data
attributes.merge(
venue_name_from_relation: self.venue_name_from_relation
)
end
def venue_name_from_relation
self.venue.name
end
然后用这个来搜索
fields = ["venue_name", "venue_name_from_relation"]
LoyaltyCard.search(query, fields: fields, load: false)
或使用(提升venue_name
超过venue_name_from_relation
)
fields = ["venue_name^2", "venue_name_from_relation"]
LoyaltyCard.search(query, fields: fields, load: false)
搜索前不要忘记reindex
。 LoyaltyCard.reindex
我有两个模型:
class Venue < ActiveRecord::Base
has_many :loyalty_cards
end
class LoyaltyCard < ActiveRecord::Base
belongs_to :venue
searchkick word_start: [:venue_name, :venue_name_from_relation]
def search_data
attributes.merge(
venue_name_from_relation: self.venue(&:name)
)
end
end
LoyaltyCard 有两个字段:
venue_id: int #used for relation with venue if such venue exists
venue_name: string #or you can add venue name manually when creating loyalty card
我想搜索这两个字段并尝试按照 GitHub 的 Searchkick isses 中的建议进行以下调整(即 https://github.com/ankane/searchkick/issues/112): searchkick word_start: [:venue_name, :venue_name_from_relation]
def search_data
attributes.merge(
venue_name_from_relation: self.venue(&:name)
)
end
它搜索 venue_name 成功,但是没有在关联的地点。
我还尝试执行以下操作(以及其他一些变体):
def search_data
{
venue_name_from_relation: venue.map(&:name)
}
end
但是重新索引失败并出现 nil class 错误。
有什么想法吗?
谢谢, 罗马
正确获取场地名称,因为它是 belongs_to
协会而不是 has_many
def search_data
attributes.merge(
venue_name_from_relation: self.venue_name_from_relation
)
end
def venue_name_from_relation
self.venue.name
end
然后用这个来搜索
fields = ["venue_name", "venue_name_from_relation"]
LoyaltyCard.search(query, fields: fields, load: false)
或使用(提升venue_name
超过venue_name_from_relation
)
fields = ["venue_name^2", "venue_name_from_relation"]
LoyaltyCard.search(query, fields: fields, load: false)
搜索前不要忘记reindex
。 LoyaltyCard.reindex