Подтвердить что ты не робот

Как избежать? (вопросительный знак) для запроса типа Postgresql JSONB в Rails

Я работаю с Rails 4.2 и Postgres 9.4, чтобы опробовать новый тип данных JSONB. Один из столбцов JSONB в моей базе данных содержит массив, и я хочу иметь возможность запрашивать записи, где этот массив содержит определенное значение. Я понял, как это сделать, используя новый JSONB "вопросительный знак" ( "содержит" ), как описано здесь: http://www.postgresql.org/docs/9.4/static/functions-json.html

Итак, в сыром SQL я могу заставить это работать, как в этом примере:

SELECT * FROM people WHERE roles ? '32486d83-4a38-42ba-afdb-f77ca40ea1fc';

Но я не вижу никакого способа сделать этот запрос из Rails через ActiveRecord. Я попытался выполнить необработанный запрос с использованием метода "where", как показано ниже:

Person.where("roles ? ?", "32486d83-4a38-42ba-afdb-f77ca40ea1fc")

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

ActiveRecord:: PreparedStatementInvalid: неверное число переменных привязки (1 для 2) в: роли?

Думаю, мне нужен способ избежать "?" потому что я хочу, чтобы он прошел буквально. Я пробовал \? а также?? без везения. Любая помощь приветствуется!

4b9b3361

Ответ 1

Вы должны вызвать это, как показано ниже:

Person.where("roles ? :name", name: "32486d83-4a38-42ba-afdb-f77ca40ea1fc")

Ответ 2

Обходной путь. Запустите этот запрос, чтобы узнать, какую функцию отображает оператор:

SELECT 
  oprname, 
  oprcode || '(' || format_type(oprleft,  NULL::integer) || ', ' 
                 || format_type(oprright, NULL::integer) || ')' AS function
FROM pg_operator 
WHERE oprname = '?';

Это дает

oprname  function
?        jsonb_exists(jsonb, text)
?        exist(hstore, text)

Теперь используйте функцию вместо оператора в вашем запросе:

Person.where("jsonb_exists(roles, ?)", "32486d83-4a38-42ba-afdb-f77ca40ea1fc")