簡體   English   中英

在RoR中搜索belongs_to關聯,使用Searchkick搜索ElasticSearch

[英]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類錯誤重新編制索引。

有任何想法嗎?

謝謝,羅馬

要正確獲取場地名稱,因為它是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)

使用(boost venue_name over venue_name_from_relation )將一個字段venue_name另一個字段

fields = ["venue_name^2", "venue_name_from_relation"]
LoyaltyCard.search(query, fields: fields, load: false)

在搜索之前不要忘記重新reindex LoyaltyCard.reindex

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM