Поиск по нескольким ключевым словам в одном текстовом поле поиска (RAILS) - PullRequest
3 голосов
/ 14 июня 2011

Я довольно новичок и играюсь с поиском баз данных в Rails. У меня есть модель и база данных, в которой есть список имен в атрибуте name. Я хочу иметь возможность вводить ключевые слова для поиска в одно поле поиска, и этот ввод может состоять из одного слова, двух или более слов, в зависимости от того, насколько конкретным будет результат, который требуется пользователю.

Прямо сейчас я использую что-то уродливое, как показано ниже, которое выполнит максимум 3 условия поиска. Есть ли способ сделать это динамическим для ключевых слов 'search_length'? Метод find явно повторяется, но я не уверен, как его автоматизировать, и не нашел ни одного полезного предложения в Интернете.

def self.search(search)

  if search
    search_length = search.split.length
    find(:all, :conditions => ['name LIKE ? AND name LIKE ? AND name LIKE ?', 
    "%#{search.split[0]}%", "%#{search.split[1]}%", 
    "%#{search.split[search_length1]}%"])
  else
    find(:all)
  end
end

Кроме этого, любящие Rails до сих пор.

Большое спасибо, Lev

Ответы [ 3 ]

7 голосов
/ 17 марта 2012

Код от Łukasz Śliwa отлично работает, если вы закроете переменную name другим знаком%.

Полный приведенный выше код работает для меня.Великий пост.

def self.search(search)

  if search
    search_length = search.split.length
    find(:all, :conditions => [(['name LIKE ?'] * search_length).join(' AND ')] + search.split.map { |name| "%#{name}%" })
  else
    find(:all)
  end

end
2 голосов
/ 14 июня 2011

Используйте что-то вроде этого:

find(:all, :conditions => [(['name LIKE ?'] * search_length).join(' AND ')] + search.split.map { |name| "%#{name}" })

Я выгляжу странно, но сначала сгенерируйте строку search_length times 'name LIKE?':

 ['name LIKE ?'] * search_length

, затем у вас есть массив с некоторыми ключами,Итак, давайте объединим их всех с помощью «И»:

 ["name LIKE ? ", "name LIKE ? ", "name LIKE ? "].join(' AND ')

и, наконец, объединимся с другим массивом.

0 голосов
/ 29 июля 2011
formatted_columns = format_column_names(Sub.column_names)
where(formatted_columns.map {|cn| "#{cn} like ?" }.join("or "), *(["%#{search}%"] * formatted_columns.size))

это заботится обо всех столбцах, а также о правильном количестве полей

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