#ruby-on-rails #ruby-on-rails-3 #search #railscasts
#ruby-on-rails #ruby-on-rails-3 #Поиск #железнодорожные трансляции
Вопрос:
Я только что посмотрел railscast о простой форме поиска, и я хочу сделать что-то подобное в своем приложении, но я не хочу находить только результаты, которые точно соответствуют.
У меня есть модель с именем Project
со следующими полями:
name
,description
,keyword1
, иkeyword2
.
Учитывая код, взятый из railscast:
models/project.rb
def self.search(search)
if search
find( :all, :conditions => ['name LIKE ?', "%#{search}%"] )
else
find(:all)
end
end
Если я хочу выполнить поиск по «Pizza», и я хотел бы, чтобы он соответствовал проекту с именем «Master Pizza Project» с keyword1 => «MasterPizza» и keyword2 => «Pizza», как бы я рефакторил приведенный выше код?
Кроме того, является ли проблема с чувствительностью к регистру?
Ответ №1:
Есть еще один railscast, где Райан Бейтс рассказывает об использовании Sphinx для полнотекстового поиска. Я бы настоятельно рекомендовал такой подход вместо того, чтобы делать что-то с нуля :
Ответ №2:
Вам нужно было бы разбить запрос на атомы, запустить каждый атом как отдельный запрос, а затем объединить результаты из каждого атома.
На данный момент все становится довольно сложным, вам было бы лучше использовать библиотеку поиска, такую как Acts as Indexed, которая позаботится обо всем этом за вас.
[Раскрытие] Я автор Acts as Indexed.
Ответ №3:
Ознакомьтесь с камнями метапоиска и Metawhere.
Ответ №4:
Я не совсем понимаю ваш вопрос, но я надеюсь, что это имеет смысл:
def self.search(search)
if search
where('title LIKE ? OR keyword1 LIKE ? OR keyword2 LIKE ?',"%#{search}%", "%#{search}%","%#{search}%")
# find(:all, :conditions => ['title LIKE ?', "%#{search}%"])
else
all
end
end