Anda tidak dapat menempatkan placeholder parameter di dalam string yang dikutip.
Fakta bahwa Rails memungkinkan Anda untuk melakukan itu dan mengganti string yang dikutip tunggal di dalam string yang dikutip tunggal menunjukkan bahwa Rails telah gagal (seperti biasa) untuk memahami aturan SQL.
Tetapi Anda dapat menempatkan placeholder parameter dalam ekspresi, dengan string lain. Saya bukan pengguna PostgreSQL biasa, tetapi saya berasumsi Anda dapat menggabungkan string bersama untuk membentuk literal JSON lengkap:
Blog.where("upload_data @> '[ { \"name\": \"' || ? || '\"}]'", name)
Anda mungkin merasa kode Anda lebih jelas jika Anda membuat parameter seluruh nilai JSON. Gunakan %Q()
untuk menghindari perlunya membuat garis miring terbalik pada tanda kutip ganda literal.
Blog.where("upload_data @> ?", %Q([ { "name": "#{name}" } ]))
Atau untuk memastikan menghasilkan JSON yang valid, saya akan meletakkan ekspresi dalam sintaks Ruby, lalu mengonversinya ke JSON:
Blog.where("upload_data @> ?", JSON.generate( [{name: name}] ))