Поиск в ассоциативной связи «принадлежит_к» в RoR, ElasticSearch с 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

Я хочу выполнить поиск в обоих полях и попробовал следующую настройку, предложенную в Searchkick isses на GitHub (т.е. 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

Он успешно ищет место проведения_название, но не в связанном месте.

Я также пытался сделать следующее (и несколько других вариантов):

  def search_data
    {
      venue_name_from_relation: venue.map(&:name)
    }
  end

однако он не выполняет переиндексацию с ошибкой класса nil.

Любые идеи?

спасибо, Роман


person Roman Krayovskyy    schedule 14.12.2015    source источник


Ответы (1)


Чтобы правильно получить название места, поскольку это ассоциация 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

person Oss    schedule 15.12.2015
comment
спасибо Мухамед! Я получаю следующую ошибку при переиндексации: LoyaltyCard Import (1.0ms) {count:4,exception:[NoMethodError,undefined method name' for nil:NilClass"]} NoMethodError: undefined method name' for nil:NilClass - person Roman Krayovskyy; 15.12.2015
comment
Если иногда ваше отношение к месту проведения может вернуться к нулю, изменение self.venue.name наself.venue.try(:name) - person Oss; 15.12.2015