Поиск хотя бы одного слова (активная запись) - PullRequest
2 голосов
/ 07 ноября 2010

У меня есть модель, скажем, с двумя полями: имя и тема И я хочу, чтобы пользователь мог ввести «Maria Chubbb» в поле поиска, и приложение должно возвращать каждую запись, которая содержит хотя бы одно слово из строки поиска (или% word%), и это слово может быть в любом из полей. Как этого добиться?

1 Ответ

0 голосов
/ 26 февраля 2013

Если вы хотите сделать это с обычным ActiveRecord / SQL, вы можете сделать это следующим образом:

words = params[:query].split(' ')
# => ["Maria", "chubbb"]
conditions = words.collect {|word| "name LIKE ? OR subject LIKE ?"}.join(" OR ")
# => "name LIKE ? OR subject LIKE ? OR name LIKE ? OR subject LIKE ?"
values = words.collect {|word| ["%#{word}%", "%#{word}%"]}.sum
# => ["%Maria%", "%Maria%", "%chubbb%", "%chubbb%"]
YourModel.where([conditions] + values)

Позже, если вы хотите сделать это «правильно», используйте поисковую систему, такую ​​как Sphinx.(подключается через Ruby / Rails через inking_sphinx гем).Затем в вашей модели вы можете определить, какие поля включить в поиск следующим образом:

class YourModel < ActiveRecord::Base
  define_index do
    indexes :name
    indexes :subject
  end
end

Затем вы можете выполнить поиск следующим образом:

YourModel.search("Maria chubbb")

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...