Nie można umieszczać symboli zastępczych parametrów wewnątrz ciągów w cudzysłowie.
Fakt, że Railsy pozwalają to zrobić i podmieniają łańcuch w pojedynczym cudzysłowie wewnątrz łańcucha w pojedynczym cudzysłowie, wskazuje, że Railsom nie udało się (jak zwykle) zrozumieć zasad SQL.
Ale możesz umieścić symbol zastępczy parametru w wyrażeniu z innymi ciągami. Nie jestem zwykłym użytkownikiem PostgreSQL, ale zakładam, że możesz łączyć ze sobą łańcuchy, tworząc kompletny literał JSON:
Blog.where("upload_data @> '[ { \"name\": \"' || ? || '\"}]'", name)
Może się okazać, że sprawi to, że kod będzie bardziej przejrzysty, jeśli sparametryzujesz całą wartość JSON. Użyj %Q()
aby uniknąć konieczności odwrotnego ukośnika w dosłownych podwójnych cudzysłowach.
Blog.where("upload_data @> ?", %Q([ { "name": "#{name}" } ]))
Lub, aby upewnić się, że wygenerowałeś prawidłowy JSON, umieściłbym wyrażenie w składni Ruby, a następnie przekonwertowałem na JSON:
Blog.where("upload_data @> ?", JSON.generate( [{name: name}] ))