Non è possibile inserire i segnaposto dei parametri all'interno di stringhe tra virgolette.
Il fatto che Rails ti permetta di farlo e sostituisca una stringa con virgolette singole all'interno della stringa con virgolette singole indica che Rails non è riuscito (come al solito) a comprendere le regole di SQL.
Ma puoi inserire un segnaposto di parametro in un'espressione, con altre stringhe. Non sono un normale utente PostgreSQL, ma presumo che tu possa concatenare le stringhe insieme per formare un letterale JSON completo:
Blog.where("upload_data @> '[ { \"name\": \"' || ? || '\"}]'", name)
Potresti scoprire che rende il tuo codice più chiaro se parametri l'intero valore JSON. Usa %Q()
per evitare di dover eseguire una barra rovesciata delle virgolette letterali.
Blog.where("upload_data @> ?", %Q([ { "name": "#{name}" } ]))
Oppure, per assicurarmi di generare JSON valido, inserirei l'espressione nella sintassi di Ruby e quindi convertirla in JSON:
Blog.where("upload_data @> ?", JSON.generate( [{name: name}] ))