PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Rails ActiveRecord :comment utiliser des variables de liaison avec des guillemets doubles sur jsonb

Vous ne pouvez pas placer d'espaces réservés de paramètres dans des chaînes entre guillemets.

Le fait que Rails vous permette de faire cela et substitue une chaîne entre guillemets simples à l'intérieur de la chaîne entre guillemets simples indique que Rails n'a pas réussi (comme d'habitude) à comprendre les règles de SQL.

Mais vous pouvez mettre un espace réservé de paramètre dans une expression, avec d'autres chaînes. Je ne suis pas un utilisateur régulier de PostgreSQL, mais je suppose que vous pouvez concaténer des chaînes pour former un littéral JSON complet :

Blog.where("upload_data @> '[ { \"name\": \"' || ? || '\"}]'", name)

Vous constaterez peut-être que cela rend votre code plus clair si vous paramétrez la valeur JSON entière. Utilisez %Q() pour éviter d'avoir à inverser les guillemets littéraux.

Blog.where("upload_data @> ?", %Q([ { "name": "#{name}" } ]))

Ou pour m'assurer de générer un JSON valide, je mettrais l'expression dans la syntaxe Ruby, puis je convertirais en JSON :

Blog.where("upload_data @> ?", JSON.generate( [{name: name}] ))