在RoR中搜索belongs_to关联,使用Searchkick搜索ElasticSearch

时间:2015-12-14 15:31:35

标签: ruby-on-rails activerecord elasticsearch belongs-to 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类错误重新编制索引。

有什么想法吗?

感谢, 罗马

1 个答案:

答案 0 :(得分:3)

要正确获取地点名称,因为它是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)

在搜索之前不要忘记reindexLoyaltyCard.reindex