No puede colocar marcadores de posición de parámetros dentro de cadenas entrecomilladas.
El hecho de que Rails le permita hacer eso y sustituya una cadena entre comillas simples dentro de la cadena entre comillas simples indica que Rails no ha podido (como de costumbre) comprender las reglas de SQL.
Pero puede colocar un marcador de posición de parámetro en una expresión, con otras cadenas. No soy un usuario habitual de PostgreSQL, pero supongo que puede concatenar cadenas para formar un literal JSON completo:
Blog.where("upload_data @> '[ { \"name\": \"' || ? || '\"}]'", name)
Puede encontrar que hace que su código sea más claro si parametriza todo el valor JSON. Usa %Q()
para evitar la necesidad de utilizar una barra invertida en las comillas dobles literales.
Blog.where("upload_data @> ?", %Q([ { "name": "#{name}" } ]))
O para asegurarme de generar un JSON válido, pondría la expresión en la sintaxis de Ruby y luego la convertiría a JSON:
Blog.where("upload_data @> ?", JSON.generate( [{name: name}] ))