Zástupné symboly parametrů nelze vkládat do řetězců v uvozovkách.
Skutečnost, že vám to Rails umožňuje a nahradí řetězec s jednou uvozovkou uvnitř řetězce s jednou uvozovkou, naznačuje, že Rails (jako obvykle) neporozuměl pravidlům SQL.
Ale můžete do výrazu vložit zástupný symbol parametru s jinými řetězci. Nejsem běžný uživatel PostgreSQL, ale předpokládám, že můžete zřetězit řetězce dohromady a vytvořit tak úplný literál JSON:
Blog.where("upload_data @> '[ { \"name\": \"' || ? || '\"}]'", name)
Možná zjistíte, že váš kód bude jasnější, pokud parametrizujete celou hodnotu JSON. Použijte %Q()
abyste se vyhnuli nutnosti zpětného lomítka doslovných dvojitých uvozovek.
Blog.where("upload_data @> ?", %Q([ { "name": "#{name}" } ]))
Nebo abych se ujistil, že vygeneruji platný JSON, vložil bych výraz do syntaxe Ruby a poté převedl na JSON:
Blog.where("upload_data @> ?", JSON.generate( [{name: name}] ))