Du kan ikke placere parameterpladsholdere i citerede strenge.
Det faktum, at Rails tillader dig at gøre det og erstatter en streng med et enkelt citat inde i strengen med et enkelt citat, indikerer, at Rails (som sædvanligt) ikke har forstået reglerne for SQL.
Men du kan sætte en parameterpladsholder i et udtryk med andre strenge. Jeg er ikke en almindelig PostgreSQL-bruger, men jeg antager, at du kan sammenkæde strenge sammen for at danne en komplet JSON-literal:
Blog.where("upload_data @> '[ { \"name\": \"' || ? || '\"}]'", name)
Du vil måske opdage, at det gør din kode mere klar, hvis du parametrerer hele JSON-værdien. Brug %Q()
for at undgå at skulle skråstille de bogstavelige dobbelte anførselstegn.
Blog.where("upload_data @> ?", %Q([ { "name": "#{name}" } ]))
Eller for at være sikker på at generere gyldig JSON, ville jeg sætte udtrykket i Ruby-syntaks og derefter konvertere til JSON:
Blog.where("upload_data @> ?", JSON.generate( [{name: name}] ))