ActiveRecord :: StatementInvalid (PG :: UndefinedFunction - PullRequest
1 голос
/ 21 марта 2019

У меня есть поле флажка (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: оператор не существует: изменение символа [] && text []) ЛИНИЯ 1: ... cars ". * FROM" cars "WHERE(car_options && ARRAY ['... ^

СОВЕТ: ни один оператор не соответствует данному имени и типу аргумента. Возможно, вам потребуется добавить явные приведения типов.car_options && ARRAY ['BY']) LIMIT $ 1

1 Ответ

2 голосов
/ 21 марта 2019

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).

...