Запрос данных, которые соответствуют строке двумя столбцами - PullRequest
2 голосов
/ 05 июня 2019

Предположим, у меня есть таблица продуктов с двумя столбцами category и name. Теперь пользователь может найти product по category или name или обоим из category и name

Например, product имеет category компьютер и name Dell. Пользователь вводит в поле поиска «Компьютер», «Dell» или «Компьютер Dell» или «Компьютер Dell», оба могут вернуть, что product

Есть идеи о Activerecord запросе для этого?

Ответы [ 2 ]

2 голосов
/ 05 июня 2019

Если вы используете mysql, вы можете использовать CONCAT для объединения category и name, а затем сделать запрос LIKE как обычно

Product.where("LOWER(CONCAT(name, ' ', category)) LIKE :query OR LOWER(CONCAT(category, ' ', name)) LIKE :query", query: "%#{params[:query].downcase}%")

С этим запросом, оба случая: Dell, Computer, Dell Computer or Computer Dell можно найти

0 голосов
/ 05 июня 2019

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

Вы можете рассмотреть возможность использования Elasticsearch, который очень легко настроить с помощью Searchkick gem .

Другим вариантом для более сложного поиска, который не требует отдельного поискового индекса, будет Ransack gem .

Но чтобы ответить на ваш конкретный вопрос, я предлагаю определить метод класса в модели вашего продукта, который преобразует поисковый термин в массив строк, а затем выполняет поиск, что-то вроде:

def self.by_name_or_category(search)

  return None unless search.present?

  keywords = search.split(' ').map {|k| "%#{k}%" }

  where('name ilike any ( array[?] )', keywords)
    .or(Product.where('category ilike any ( array[?] )', keywords))

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