मुझे नहीं पता कि क्या बेहतर है:मेरे प्रश्न का उत्तर दें या इसे अपडेट करें ... इसलिए मैं उत्तर देना चुनता हूं। कृपया मुझे बताएं कि क्या अपडेट करना बेहतर है
हम अंत में समस्या का पता लगाते हैं। संस्करण 3.1 के बाद से, रेल ने User.find(id) जैसे सरल अनुरोध पर तैयार विवरण जोड़े। संस्करण 4.0, संघों पर अनुरोधों के लिए तैयार किए गए बयान जोड़े (has_many, संबंधित_to, has_one)। उदाहरण के लिए निम्नलिखित कोड:
class User
has_many :adresses
end
user.addresses
अनुरोध उत्पन्न करें
SELECT "addresses".* FROM "addresses" WHERE "addresses"."user_id" = $1 [["user_id", 1]]
समस्या यह है कि रेल केवल विदेशी कुंजी (यहां user_id) के लिए तैयार कथन चर जोड़ते हैं। यदि आप
. जैसे कस्टम sql अनुरोध का उपयोग करते हैंuser.addresses.where("moved_at < ?", Time.now - 3.month)
यह Move_at के लिए तैयार किए गए कथनों में एक चर नहीं जोड़ेगा। इसलिए जब भी अनुरोध कहा जाता है तो यह हर बार तैयार बयान उत्पन्न करता है। रेल तैयार किए गए बयानों को अधिकतम आकार 1000 के पूल के साथ संभालती है।
हालांकि, पोस्टग्रेस्क्ल तैयार बयान पूरे कनेक्शन में साझा नहीं किए जाते हैं, इसलिए एक या दो घंटे में प्रत्येक कनेक्शन में 1000 तैयार बयान होते हैं। उनमें से कुछ बहुत बड़े हैं। इससे पोस्टग्रेक्स्ल सर्वर पर बहुत अधिक मेमोरी खपत होती है।