आप पैरामीटर प्लेसहोल्डर को उद्धृत स्ट्रिंग्स के अंदर नहीं रख सकते।
तथ्य यह है कि रेल आपको ऐसा करने की अनुमति देता है और एकल-उद्धृत स्ट्रिंग के अंदर एकल-उद्धृत स्ट्रिंग को प्रतिस्थापित करता है, यह दर्शाता है कि SQL के नियमों को समझने में रेल विफल (हमेशा की तरह) है।
लेकिन आप एक पैरामीटर प्लेसहोल्डर को अन्य स्ट्रिंग्स के साथ एक एक्सप्रेशन में रख सकते हैं। मैं एक नियमित PostgreSQL उपयोगकर्ता नहीं हूं, लेकिन मुझे लगता है कि आप एक पूर्ण JSON शाब्दिक बनाने के लिए स्ट्रिंग्स को एक साथ जोड़ सकते हैं:
Blog.where("upload_data @> '[ { \"name\": \"' || ? || '\"}]'", name)
यदि आप संपूर्ण JSON मान को पैरामीटर करते हैं, तो आप पा सकते हैं कि यह आपके कोड को और अधिक स्पष्ट करता है। %Q()
का प्रयोग करें शाब्दिक दोहरे उद्धरणों को बैकस्लैश करने की आवश्यकता से बचने के लिए।
Blog.where("upload_data @> ?", %Q([ { "name": "#{name}" } ]))
या वैध JSON उत्पन्न करना सुनिश्चित करने के लिए, मैं अभिव्यक्ति को रूबी सिंटैक्स में डालूंगा, और फिर JSON में कनवर्ट करूंगा:
Blog.where("upload_data @> ?", JSON.generate( [{name: name}] ))