У меня есть поле флажка (car_options), в котором хранится массив значений для ряда вариантов.
Мне нужно запросить все записи Car, которые содержат какие-либо значения в другом массиве.
["a", "b", "c", "d", "e", "f"], который содержит любой из следующих ["b", "z", "v"]
t.string "car_options", default: [], array: true
Проверьте, содержит ли массив attr какой-либо элемент из данного массива в Rails
Car.where('car_options && ARRAY[?]', ["4door","3seat"])
ActiveRecord::StatementInvalid (PG::UndefinedFunction: ERROR: operator does not exist: character varying[] && text[]) LINE 1: ...cars".* FROM "cars" WHERE (car_options && ARRAY['...^
HINT: No operator matches the given name and argument types. You might need to add explicit type casts. : SELECT "cars".* FROM "cars" WHERE (car_options && ARRAY['BY']) LIMIT $1





PostgreSQL жалуется, потому что ARRAY[?] оказывается text[] (т. е. массивом text), тогда как ваш столбец car_options представляет собой character varying[] (т. е. массив character varying).
Вы можете привести литерал массива:
Car.where('car_options && ARRAY[?]::varchar[]', ["4door","3seat"])
или сделайте колонку text[]:
t.text "car_options", default: [], array: true
Я бы, вероятно, выбрал последнее, потому что PostgreSQL обрабатывает типы text и character varying внутри одинаково, единственный раз, когда вы будете возиться с varchar (AKA character varying или t.string в миграции), это если у вас есть жесткое ограничение на их длину. (и даже тогда вы могли бы использовать text с ограничением CHECK).