Могу ли я найти элемент в базе данных с заданным массивом строк, но с использованием частичной строки? - PullRequest
0 голосов
/ 03 ноября 2019

У меня есть модель Product с name и category

На начальном этапе:

Product.create(name: "apple", category: "food")
Product.create(name: "biogesic", category: "medicine")

И двухмерный массив:

[[1, "tray of apple", 150.00], [1, "box of ballpen", 70.30]]

Что мне нужно, это получить, если строка внутри массива содержит или находится в таблице / базе данных Product

Вот что я думаю, но я потерялся:

isProduct = Product.where("name like ?", "%an apple%").first

Где "%apple%" должна быть строкой в ​​array, но с этим кодом она ограничена только одним словом.

Мне не нужен продукт id, он мне просто нужен, если оннаходится на Product столе.

1 Ответ

3 голосов
/ 03 ноября 2019

Определенным образом это можно сделать с помощью оператора регулярных выражений ~ для PostgreSQL и / или REGEXP для MySQL:

regex = array.flat_map { |_, sentence, _| sentence.split }.join('|')
Product.exists?(['name ~ ?', regex])
Product.exists?(['name REGEXP ?', regex])

, который выдает:

SELECT 1 AS one FROM "products" WHERE (name ~ 'tray|of|apple|box|of|ballpen') LIMIT $1  [["LIMIT", 1]]

Как он ищет присутствие каждого отдельного слова в предложениях лоток с яблоком и / или коробка шариковой ручки .

Итак, если у вас естьзапись типа:

Product.new(name: 'tray of apple and box of ballpen')

Она покроет запрос и вернет true.

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