ruby-on-rails - rails - postgresql nosql json
¿Cómo escapar del?(signo de interrogación) operador para consultar el tipo Postgresql JSONB en Rieles (2)
Estoy trabajando con Rails 4.2 y Postgres 9.4 para probar el nuevo tipo de datos JSONB. Una de las columnas de JSONB en mi base de datos contiene una matriz, y quiero poder consultar los registros donde esta matriz contiene un cierto valor. Descubrí cómo hacerlo utilizando el nuevo operador JSONB "signo de interrogación" ("contiene"), como se documenta aquí: http://www.postgresql.org/docs/9.4/static/functions-json.html
Entonces, en SQL sin formato puedo hacer que funcione como en este ejemplo:
SELECT * FROM people WHERE roles ? ''32486d83-4a38-42ba-afdb-f77ca40ea1fc'';
Pero no veo ninguna forma de hacer esta consulta desde Rails a través de ActiveRecord. He intentado hacer una consulta sin procesar usando el método "where", de la siguiente manera:
Person.where("roles ? ?", "32486d83-4a38-42ba-afdb-f77ca40ea1fc")
Pero como el signo de interrogación es un carácter especial que se usa para reemplazar parámetros, aparece este error:
ActiveRecord :: PreparedStatementInvalid: número incorrecto de variables de enlace (1 para 2) en: roles? ?
¿Supongo que necesito una forma de escapar del "?" personaje porque quiero que pase literalmente. He intentado /? y ?? sin suerte ¡Cualquier ayuda es apreciada!
Debe llamar a esto de la siguiente manera:
Person.where("roles ? :name", name: "32486d83-4a38-42ba-afdb-f77ca40ea1fc")
Una solución. Ejecute esta consulta para averiguar a qué función se asigna su operador:
SELECT
oprname,
oprcode || ''('' || format_type(oprleft, NULL::integer) || '', ''
|| format_type(oprright, NULL::integer) || '')'' AS function
FROM pg_operator
WHERE oprname = ''?'';
Cede
oprname function
? jsonb_exists(jsonb, text)
? exist(hstore, text)
Ahora usa la función en lugar del operador en tu consulta:
Person.where("jsonb_exists(roles, ?)", "32486d83-4a38-42ba-afdb-f77ca40ea1fc")