Не можете да поставяте заместители на параметри в низове в кавички.
Фактът, че Rails ви позволява да направите това и замества низ с единични кавички вътре в низа с единични кавички, показва, че Rails не е успял (както обикновено) да разбере правилата на SQL.
Но можете да поставите заместител на параметър в израз с други низове. Не съм редовен потребител на PostgreSQL, но предполагам, че можете да свържете низове заедно, за да образувате пълен JSON литерал:
Blog.where("upload_data @> '[ { \"name\": \"' || ? || '\"}]'", name)
Може да откриете, че прави кода ви по-ясен, ако параметризирате цялата JSON стойност. Използвайте %Q()
за да избегнете необходимостта от обратна наклонена черта на буквалните двойни кавички.
Blog.where("upload_data @> ?", %Q([ { "name": "#{name}" } ]))
Или за да се уверя, че генерирам валиден JSON, бих поставил израза в синтаксиса на Ruby и след това бих конвертирал в JSON:
Blog.where("upload_data @> ?", JSON.generate( [{name: name}] ))