引用符で囲まれた文字列内にパラメータプレースホルダーを配置することはできません。
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}] ))