Используя Tire с Mongoid, я не могу понять, как структурировать запрос для поиска событий с помощью ElasticSearch. В частности, я пытаюсь найти события, которые смотрят пользователи, в дополнение к событиям с исполнителями, на которые подписан пользователь:
# app/models/event.rb
class Event
include Mongoid::Document
include Tire::Model::Search
include Tire::Model::Callbacks
field :name, type: String
has_and_belongs_to_many :performers
has_many :watchers, class_name: 'User'
mapping do
indexes :name
indexes :watcher_ids, type: 'string', index: :not_analyzed
indexes :performer_ids, type: 'string', index: :not_analyzed
end
end
Следующий запрос работает только для наблюдателей или исполнителей.
Tire.search 'events' do
query do
string params[:query]
# Only one of these will work at a time:
terms :performer_ids, current_user.followed_performers.collect(&:id).map(&:to_s)
terms :watcher_ids, [current_user.id.to_s]
end
end
- небольшое редактирование, потому что я неправильно набрал свой пример.
Вот решение, которое кажется "работающим"... но кажется неправильным
Tire.search('events') do
query do
boolean do
should { string params[:query] }
should { string "performer_ids:#{current_user.followed_performers.collect(&:id).map(&:to_s).join(',')}" }
should { string "watcher_ids:#{current_user.id.to_s}" }
end
end
end