Поиск нескольких слов по нескольким моделям - PullRequest
1 голос
/ 11 августа 2011

Я пытаюсь создать поисковую функцию на сайте и хочу, чтобы пользователь мог выполнять поиск по нескольким словам, выполняя подстроку, соответствующую критериям, существующим в различных моделях.

РадиВ этом примере, скажем, у меня есть следующие модели:

  • Сотрудник
  • Компания
  • Муниципалитет
  • Округ

В округе есть несколько муниципалитетов, в которых есть несколько компаний, в которых работают несколько сотрудников.

Я хочу, чтобы поиск мог выполнять поиск по комбинации Employee.firstname, Employee.lastname, Company.name, Municipality.name и County.name, и я хочу, чтобы конечным результатом были экземпляры Employee.

Например, поиск строки "joe tulsa" должен вернуть всех сотрудников, где оба слова можно найти где-то в свойствах, которые я назвалв предыдущем предложении.Я получу несколько ложных срабатываний, но, по крайней мере, я должен получить каждого сотрудника по имени "Джо" в округе Талса.

Я пробовал пару подходов, но я не уверен, что ухожуправильный путь.Я ищу хороший способ сделать это с помощью RoR, и я надеюсь, что кто-то с большей мудростью RoR может помочь наметить правильное решение.


Что я пробовал:

Я не очень разбираюсь в таком поиске, но вне RoR я бы вручную создал оператор SQL, чтобы объединить все таблицы, создать предложения where для каждого отдельного слова поиска, охватывающего разные таблицы.Возможно, использовать строитель.Затем просто выполните запрос и выполните циклический просмотр результатов, вручную создайте экземпляры объектов Employee и добавьте их в массив.

Чтобы решить эту проблему в RoR, я:

1) Привязка к имениОбласти в том, что в моем проекте соответствует модели Employee, но я застрял, когда мне нужно было объединить таблицы в двух или более «шагах» (муниципалитет и округ).

2) Создан вид (называемый «search_view ") объединение всех таблиц для упрощения запроса.Затем подумал, что я буду использовать Employee.find_by_sql () в этой таблице, что даст мне эти хорошие объекты Employee.Я подумал, что для создания SQL воспользуюсь компоновщиком, и мне показалось, что нужно использовать Arel, поэтому я попытался сделать что-то вроде:

view = Arel::Table.new(:search_view)

Но полученный Ariel :: Table не содержитлюбые столбцы, так что это не годится для построения моего запроса.На данный момент я немного застрял, так как не знаю, как получить работающий построитель запросов.

1 Ответ

3 голосов
/ 11 августа 2011

Я настоятельно рекомендую использовать подходящую поисковую систему для чего-то подобного, это сделает вашу жизнь намного проще.У меня была похожая проблема, и я подумал: «Бьюсь об заклад, установка чего-то вроде Сфинкса означает, что я должен сначала прочитать тысячи руководств и руководств».Ну, это не тот случай.

Thinking Sphinx - это жемчужина Rails, которую я рекомендую, что упрощает интеграцию Sphinx.Вам не нужно иметь большой опыт, чтобы начать:

http://freelancing -god.github.com / ts / en /

У меня есть 'Я пробовал другие поисковые системы, но я очень доволен Сфинксом.Мне удалось настроить относительно сложный поиск в реальном времени менее чем за день.

...