Sunspot с несколькими моделями (в Rails) - PullRequest
14 голосов
/ 18 мая 2011

У меня есть три модели (User, Tag, Product), и они взаимодействуют друг с другом. User имеет много Tags и Products.

В целях поиска я хотел бы иметь возможность выполнять поиск (с одной панелью поиска) по именам пользователей, тегам и описаниям продуктов. Я также хотел бы выполнить поиск на страницах продуктов, но это относится только к названиям тегов и описаниям продуктов.

Вот два примера:

Поиск: «Линус Торвальдс» возвращает все экземпляры Линуса Торвальдса в трех моделях, причем любые экземпляры имени пользователя располагаются выше.

Поиск: «Linux» с возрастом: «20-25» возвращает все экземпляры пользователей с продуктами, которые включают «Linux» в своем названии / описании и попадают в этот возрастной диапазон, а также пользователей с тегами, которые включают «Linux "и у кого есть продукты, которые попадают в этот возрастной диапазон. Обратите внимание, что если в поиске не указан возраст, то по умолчанию он будет по умолчанию для всех, кто соответствует части «Linux», а не для нее.

Мой вопрос: как лучше всего это сделать? Должен ли я создать поисковую модель со своим собственным контроллером? Должен ли я просто игнорировать это и включить поисковый фрагмент в общую папку? Какие еще есть методы?

Большое спасибо.

1 Ответ

23 голосов
/ 18 мая 2011

Мне нравится идея объекта поиска, если вы выполняете какие-либо сложные условия.

Но для поиска по объектам с помощью Sunspot:

@sunspot_search = Sunspot.search User, Tag, Product do |query| 
  query.keywords @search_query
  query.with(:age).greater_than 20
  query.with(:age).less_than 25
  query.paginate(:page => params[:page], :per_page => 30)
end
...