Как настроить поиск фасетов эластичного поиска на модели вложенных рельсов
Можно ли настроить поиск фасетов на вложенной модели? У меня есть модель пользователя, которая имеет модель профиля. Я могу искать пользовательскую модель для терминов в профильной модели. Теперь я хочу отфильтровать результаты поиска (пользователей) по атрибуту местоположения в модели профиля.
Модель пользователя:
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
просто следовать рельсовому соглашению о разделении ассоциаций с подчеркиванием.