Помогите мне правильно найти этот поисковый запрос - PullRequest
0 голосов
/ 23 апреля 2011

Моя таблица пользователей содержит столбцы first_name и last_name, а name - это виртуальный атрибут.Например, у меня есть эти записи:

Aen Tan
Lily Chou Chou
Nuon Baby

Когда я ищу по двум словам, я получаю ожидаемый результат:

"aen tan" Aen Tan
"lily chou" Lily Chou Chou

Но когда я ищу по одному слову, например "aen" Я получаю все три записи.

Вот мой запрос:

scope :find_by_name, lambda {|name| where("first_name LIKE ? or last_name LIKE ?",  '%' + name.split(' ').first + '%', '%' + name.split(' ')[1, name.split(' ').length-1].join(' ') + '%')}

И он выдает этот SQL, когда я ищу по одному слову " aen ":

SELECT `users`.* FROM `users` WHERE (first_name LIKE '%aen%' or last_name LIKE '%%')

Думаю, проблема в том, что фамилия пуста.Как это исправить?Если дано только одно слово, должен ли я искать в обоих столбцах слово?

Это подводит меня к чему-то еще, о чем я думаю.Если я найду «tan + aen», я ничего не получу, но вполне возможно, что пользователи получат обратный порядок имен.Как я могу создать запрос, который учитывает это?

Ответы [ 3 ]

1 голос
/ 23 апреля 2011

Вы можете сделать область видимости как функцию примерно так. Это делает предположение, что имя будет состоять только из 2 слов.

def self.find_by_name(name)
  names = split(' ')
  if names.size == 1
    YourModel.where("first_name LIKE ?", "%#{names.first}%")
  else
    YourModel.where("first_name LIKE ? AND last_name LIKE ?", "%#{names.first}%")
  end
end

Лучшим решением было бы иметь атрибут таблицы full_name, по которому вы могли бы искать. Это было бы легко встроить в вашу модель после создания.

Тогда у вас будет просто область видимости:

scope :find_by_name, {|name| where("full_name LIKE ?", "%#{name}%")}
0 голосов
/ 23 апреля 2011
SELECT users.* FROM users WHERE (first_name LIKE '%Aen%' And last_name LIKE '%%')

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

0 голосов
/ 23 апреля 2011

Вы можете:

  • НЕ искать в last_name, если в поисковом запросе нет второго слова
  • Поместите ваше состояние в AND состояние вместо OR. Я полагаю, что вы будете искать пользователей с обоими именем И фамилией, соответствующей вашему запросу.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...