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}] ))