Bạn không thể đặt trình giữ chỗ tham số bên trong các chuỗi được trích dẫn.
Thực tế là Rails cho phép bạn làm điều đó và thay thế một chuỗi được trích dẫn đơn bên trong chuỗi được trích dẫn đơn chỉ ra rằng Rails đã không hiểu được các quy tắc của SQL (như thường lệ).
Nhưng bạn có thể đặt một trình giữ chỗ tham số trong một biểu thức, với các chuỗi khác. Tôi không phải là người dùng PostgreSQL thông thường, nhưng tôi cho rằng bạn có thể nối các chuỗi với nhau để tạo thành một chữ JSON hoàn chỉnh:
Blog.where("upload_data @> '[ { \"name\": \"' || ? || '\"}]'", name)
Bạn có thể thấy nó làm cho mã của bạn rõ ràng hơn nếu bạn tham số hóa toàn bộ giá trị JSON. Sử dụng %Q()
để tránh cần phải gạch chéo ngược các dấu ngoặc kép theo nghĩa đen.
Blog.where("upload_data @> ?", %Q([ { "name": "#{name}" } ]))
Hoặc để đảm bảo tạo JSON hợp lệ, tôi sẽ đặt biểu thức theo cú pháp Ruby, sau đó chuyển đổi thành JSON:
Blog.where("upload_data @> ?", JSON.generate( [{name: name}] ))