我有两个模型:
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:[:地点名称,:地点名称来自_关系]
def search_data
attributes.merge(
venue_name_from_relation: self.venue(&:name)
)
end
它成功搜索了 field 名称,但是没有在关联的 field 中搜索。
我还尝试了以下操作(以及其他一些改进):
def search_data
{
venue_name_from_relation: venue.map(&:name)
}
end
但是,它无法通过nil类错误重新索引。
有任何想法吗?
谢谢,
罗曼
最佳答案
要正确获取 field 名称,因为它是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
关于ruby-on-rails - 在RoR,ElasticSearch和Searchkick中在归属关系中搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34270805/