Рельсы, где LIKE и массив

Как я могу сделать что-то вроде этого?

myarray = ["name1","name2"]
Product.where('name ILIKE ?', %#{myarray}%)

Мне нужно получить все продукты, где имена похожи на name1 и name2.

Возможно ли это?

Ответ 1

Я думаю, вы хотите проверить все значения с помощью функции ILIKE.

Вот как это делается в Postgres:

select * from table where value ilike any (array['%foo%', '%bar%', '%baz%']);

Попробуйте преобразовать в синтаксис Rails/Ruby следующим образом:

myarray_with_percetage_signs = ["name1","name2"].map {|val| "%#{val}%" }
Product.where("name ILIKE ANY ( array[?] )", myarray_with_percetage_signs)

Ответ 2

Если вы ищете строковое подобие в смысле равенства (например, LIKE 'string' в SQL) where принимает значения типа Hash:

Product.where(name: myarray)

Product.where(name: myarray).to_sql
  # => SELECT "products".* FROM "products"  WHERE "products"."name" IN ('x', 'y')

Однако, если вы хотите фильтровать подстроки (например, LIKE '%substring%' в SQL), проверьте ответ Эдгарса Джекасона.

Ответ 3

Product.where('name IN (?)', myarray)

должен сделать трюк;)