Написание метода поиска, который соответствует свободно - PullRequest
1 голос
/ 31 мая 2011

Я только что посмотрел 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

Если я хочу найти «Пицца», и я бы хотел эточтобы сопоставить проект с именем «Master Pizza Project» с keyword1 => «MasterPizza» и keyword2 => «Pizza», как бы я провел рефакторинг вышеуказанного кода?

Кроме того, является ли проблема чувствительностью к регистру?

Ответы [ 4 ]

0 голосов
/ 09 февраля 2012

Я не совсем понимаю ваш вопрос, но надеюсь, что это имеет смысл:

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    
0 голосов
/ 31 мая 2011

Вам нужно разделить запрос на атомы, запустить каждый атом как отдельный запрос, а затем объединить результаты каждого атома.

В этот момент все становится довольно сложным, вам лучше использовать библиотеку поиска, такую ​​как Acts as Indexed , которая позаботится обо всем этом для вас.

[Раскрытие информации] Я являюсь автором Актов в качестве проиндексированных.

0 голосов
/ 31 мая 2011

Ознакомьтесь с метаисследованием и Metawhere gems.

0 голосов
/ 31 мая 2011

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

http://railscasts.com/episodes/120-thinking-sphinx

...