PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Rails ActiveRecord:Como usar variáveis ​​de ligação com aspas duplas no jsonb


Você não pode colocar marcadores de posição de parâmetro dentro de strings entre aspas.

O fato do Rails permitir que você faça isso e substituir uma string entre aspas simples dentro da string entre aspas indica que o Rails falhou (como sempre) em entender as regras do SQL.

Mas você pode colocar um placeholder de parâmetro em uma expressão, com outras strings. Eu não sou um usuário regular do PostgreSQL, mas suponho que você possa concatenar strings para formar um literal JSON completo:
Blog.where("upload_data @> '[ { \"name\": \"' || ? || '\"}]'", name)

Você pode achar que seu código fica mais claro se parametrizar todo o valor JSON. Use %Q() para evitar a necessidade de barra invertida as aspas duplas literais.
Blog.where("upload_data @> ?", %Q([ { "name": "#{name}" } ]))

Ou para ter certeza de gerar um JSON válido, eu colocaria a expressão na sintaxe Ruby e depois converteria para JSON:
Blog.where("upload_data @> ?", JSON.generate( [{name: name}] ))