Как настроить поиск фасетов эластичного поиска на модели вложенных рельсов

Можно ли настроить поиск фасетов на вложенной модели? У меня есть модель пользователя, которая имеет модель профиля. Я могу искать пользовательскую модель для терминов в профильной модели. Теперь я хочу отфильтровать результаты поиска (пользователей) по атрибуту местоположения в модели профиля.

Модель пользователя:

class User< ActiveRecord::Base
  has_one :profile

  include Tire::Model::Search
  include Tire::Model::Callbacks

  mapping do
   indexes :profiles do
    indexes :first_name
    indexes :last_name
    indexes :summary, type: 'string'
    indexes :location, type: 'string', boost: 50
    indexes :subjects, type: 'string', boost: 100
    indexes :education, type: 'string'
   end
  end

  def self.search(params)
    tire.search(load: true, page: params[:page], per_page: 10) do |s|
      s.query { string params[:query]} if params[:query].present?
      s.facet "locations" do
        terms :location???
      end
    end
  end

  # Rest of class omitted
end

В методе поиска я не знаю, что записать для "терминов". terms :location???

Посмотреть:

  <% @allusers.facets['locations'??]['terms'].each do |facet| %> **error on this line, locations cannot be nil**
      <li>
      <%= link_to_unless_current Profile.find(facet['term']).location, params.merge(id: facet['term']) %>
        <% if params[:location??] == facet['term'].to_s %>
          (<%= link_to "remove", location: nil %>)
        <% else %>
          (<%= facet['count'] %>)
        <% end %>
      </li>
    <% end %>

По мнению я не знаю, что записать для params вместо [:location]

1 ответ

Решение

Вы должны быть в состоянии заменить terms :location с terms "profiles.location", Обратите внимание, что теперь это строка вместо символа. Хотя вам может понадобиться term вместо этого, или вы разрешаете своим пользователям иметь несколько мест в своем профиле?

Поле формы и имя фасета не нужно менять. Вы можете назвать свой фасет "foobar", и он будет работать, пока имя фасета одинаково и в модели, и в представлении. Параметр аналогичен, он просто содержит значение и может называться как угодно. Я хотел бы рассмотреть его переименование в profile_location просто следовать рельсовому соглашению о разделении ассоциаций с подчеркиванием.

Другие вопросы по тегам