rails postgres ruby-on-rails postgresql activerecord jsonb

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