2011-12-09 8 views
11

यदि आप एआरएल स्कोप में joins का उपयोग करते हैं, तो परिणाम केवल पढ़ने के लिए हो जाता है (यानी आप किसी भी रिकॉर्ड को वापस अपडेट नहीं कर सकते)। यदि आप परिणाम को केवल पढ़ने के लिए पसंद नहीं करेंगे, तो आप केवल readonly(false) दायरे में श्रृंखला, उदाहरण के लिएजॉइन का उपयोग करते समय एआरएल स्कॉप्स केवल पढ़ने के लिए क्यों होते हैं?

User.joins(:orders).where(:orders => { :state => 'completed' }).readonly(false)

लेकिन मेरा अनुमान है कि वहाँ एक कारण है कि शामिल होने-स्कोप डिफ़ॉल्ट रूप से केवल पढ़ने के लिए कर रहे हैं कि। परिणामों को केवल पढ़ने के लिए सेट करने का कारण क्या है?

उत्तर

1

दिलचस्प सवाल। मैं चारों ओर गुगल रहा था ..... एक जॉइन पूछताछ के साथ, आप उपयोगकर्ता + ऑर्डर टेबल विशेषताओं के साथ एक रिकॉर्ड वापस प्राप्त कर रहे हैं। यदि आपने उपयोगकर्ता तालिका के बजाय ऑर्डर तालिका में किसी एक विशेषता को अपडेट करने का प्रयास किया है ("order_num" कहें), तो उपयोगकर्ता तालिका में अद्यतन कथन order_num नहीं ढूंढ पाएगा और क्रैश होगा। इसलिए जुड़ने के लिए डिफ़ॉल्ट रूप से शामिल-स्कॉप्स केवल पढ़ने के लिए होते हैं।

संदर्भ: - * * आदेश गुण नहीं है, क्योंकि यह एक 'चुने जाने वाले प्रयोक्ताओं कर रहा है 1) http://blog.ethanvizitei.com/2009/05/joins-and-namedscopes-in-activerecord.html
2) Proper way to prevent ActiveRecord::ReadOnlyRecord?

+2

जहां तक ​​मैं देख सकता हूँ, 'SELECT' क्वेरी केवल उपयोगकर्ता विशेषताओं का रिटर्न * से ... '। इसलिए लौटाए गए ActiveRecord ऑब्जेक्ट में कोई ऑर्डर विशेषता नहीं होनी चाहिए, जहां तक ​​मैं –

+0

समझ सकता हूं, मैं इसे मूल मॉडल की सामग्री को वापस देखता हूं। यह डिफ़ॉल्ट दायरे में शामिल होने का उपयोग करना मुश्किल बनाता है। मैं एक पदानुक्रमित मॉडल पारिस्थितिक तंत्र (जैसे कि आदेश "निष्क्रिय" पर आधारित गैर-सक्रिय रिकॉर्ड को फ़िल्टर करने के लिए डिफ़ॉल्ट दायरे में शामिल होने का उपयोग करता है, तो ऑर्डर_लाइन को डिफ़ॉल्ट रूप से वापस नहीं किया जाना चाहिए। इस प्रकार ऑर्डरलाइन डिफ़ॉल्ट_स्कोप {joins (: order)} और ऑर्डर डिफ़ॉल्ट_स्कोप {जहां (सक्रिय: सत्य)}। – TJChambers

संबंधित मुद्दे