Подтвердить что ты не робот

Поиск нескольких столбцов - Rails

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

def self.search(search)
  if search
    find(:all, :conditions => ['game_name LIKE ? OR genre LIKE ? OR console LIKE ?', "%#{search}%", "#{search}", "#{search}"])
  else
    find(:all)
  end
end

Теперь, когда поиск выполняется нормально, но моя проблема в том, что если в файле game_name есть слово "playstation", оно завершит поиск там. Он возвращает только эту запись, а не все игры, в которых "playstation" хранится в консоли. Теперь я понимаю это потому, что у меня есть "OR" в моих условиях, но я не знаю альтернативы. "И" требует, чтобы все условия совпадали или вообще не возвращались. Какую альтернативу я могу использовать для AND и OR? Помощь будет высоко оценена.

Если есть решение, в котором есть отдельные поля поиска и записи, то это будет хорошо, я не обязательно требую, чтобы поиск нашел все это на основе одной формы поиска.

4b9b3361

Ответ 1

Если я правильно понимаю ваш вопрос, ваш SQL выглядит хорошо для меня за то, что вы пытаетесь сделать. Предложение OR возвращает все записи, соответствующие столбцам 1, столбцу2 или столбцу3. Это не останавливается в первом матче. Я вижу проблему с вашими параметрами в том, что вначале вы используете LIKE с%, но во втором случае вы не являетесь, возможно, именно там и возникает ваша проблема.

Если это ваша находка (% вокруг второго и третьего поиска)?

find(:all, :conditions => ['game_name LIKE ? OR genre LIKE ? OR console LIKE ?', "%#{search}%", "%#{search}%", "%#{search}%"])

или лучше использовать версию DRY (выше не будет работать для Rails 4.2 +):

Item.where('game_name LIKE :search OR genre LIKE :search OR console LIKE :search', search: "%#{search}%")

Ответ 2

Что делать, если у вас есть 15 столбцов для поиска, тогда вы будете повторять 15 раз. Вместо повторения клавиши 15 раз в запросе вы можете написать вот так:

key = "%#{search}%"

@items = Item.where('game_name LIKE :search OR genre LIKE :search OR console LIKE :search', search: key).order(:name)

Он даст вам тот же результат.

Спасибо

Ответ 3

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

key = "%#{search}%"
columns = %w{game_name genre console}
@items = Item.where(
  columns
    .map {|c| "#{c} like :search" }
    .join(' OR '),
  search: key
)