named scope - rails named_scope ignores eager loading -


दो मॉडल (रेल 2.3.8):

  • उपयोगकर्ता; उपयोगकर्ता नाम & amp; अक्षम गुण; उपयोगकर्ता के पास है: प्रोफ़ाइल
  • प्रोफ़ाइल; पूर्ण_नाव & amp; छिपी हुई संपत्तियों

मैं नामित_स्स्कोप बनाने की कोशिश कर रहा हूं जो अक्षम = 1 और छिपा हुआ = 1 उपयोगकर्ता-प्रोफाइल को समाप्त कर रहा है। प्रयोक्ता मॉडल आमतौर पर प्रोफाइल मॉडल के संयोजन के रूप में उपयोग किया जाता है, इसलिए मैं प्रोफ़ाइल मॉडल ((इसमें शामिल =>: प्रोफ़ाइल) को उत्सुक-लोड करने का प्रयास करता हूं।

मैंने एक उपयोगकर्ता नाम पर नामित_स्स्कोप को 'दृश्यमान' बनाया ':

  नामित_स्स्कोप: दृश्यमान, {: joins = & gt; "INNER यूज़र्स.आईडी = प्रोफाइल.युसर_आईडी पर शामिल हों",: conditions = & gt; ["Users.disabled =? And profiles.hidden =?", False, false]}  

मैंने देखा है कि जब मैं एक क्वेरी में name_scope का उपयोग करता हूं, उत्सुक लोडिंग निर्देश

विविधता 1 - उपयोगकर्ता मॉडल केवल:

  # UserController @users = User.find (: सभी) # उपयोगकर्ता के लिए इंडेक्स दृश्य & lt;% @ उपयोगकर्ता% & gt; & Lt; p & gt; & lt;% = उपयोगकर्ता। उपयोगकर्ता नाम% & gt; & lt; / p & gt; & Lt;% end% & gt; # एक एकल क्वेरी जनरेट करता है: SELECT * FROM `users`  

विविधता 2 - उपयोग प्रोफ़ाइल मॉडल को देखने में; आलसी लोड प्रोफाइल मॉडल

  # UserController @users = User.find (: सभी) # उपयोगकर्ता के दर्शक दृश्य & lt;% उपयोगकर्ता @ यूज़र% में & amp;%; & Lt; p & gt; & lt;% = उपयोगकर्ता। उपयोगकर्ता नाम% & gt; & lt; / p & gt; & Lt; p & gt; & lt;% = user.profile.full_name% & gt; & lt; / p & gt; & Lt;% end% & gt; # एकाधिक क्वेरीज़ जेनरेट करते हैं: SELECT * FROM `प्रोफाइल 'WHERE (` प्रोफाइल'.USER_ID = 1) ORDER द्वारा full_name एएससी सीमा 1 से प्रोफाइल दिखाएं' प्रोफाइल 'से चुनें `प्रोफ़ाइल' से WHERE (` प्रोफाइल '। यूज़र_आईड = 2) ORDER पूर्ण_नाव द्वारा एएससी सीमा 1 का चयन करें * `प्रोफ़ाइल 'से WHERE (` प्रोफाइल'। यूज़र_आईडी = 3) ORDER द्वारा full_name ASC LIMIT 1 SELECT * FROM 'प्रोफाइल' WHERE (`प्रोफाइल'.user_id = 4) ORDER BY full_name ASC LIMIT 1 SELECT * `प्रोफाइल` से WHERE (` प्रोफाइल'.यूएसआईआर_आईडी = 5) ORDER द्वारा full_name ASC LIMIT 1 SELECT * FROM `प्रोफाइल 'WHERE (` प्रोफाइल'.user_id = 6) ORDER द्वारा full_name एएससी सीमा 1  
<पी> विविधता 3 - उत्सुक लोड प्रोफाइल मॉडल

  # UserController @users = User.find (: सभी,: शामिल = & gt;: प्रोफ़ाइल) # view; कोई परिवर्तन नहीं # दो प्रश्नों का चयन करें * उपयोगकर्ताओं से 'चुनें `प्रोफाइल। * से` प्रोफाइल' जहां (`प्रोफाइल '। यूज़र ईआईडी (1,2,3,4,5,6))  

  # उपयोगकर्ता नियंत्रक @ यूज़र = उपयोगकर्ता। विज़िबिल (: = इसमें शामिल है: प्रोफ़ाइल) # दृश्य; कोई भी परिवर्तन # कई प्रश्नों का चयन नहीं करता है `उपयोगकर्ता` का चयन करें। * उपयोगकर्ता से INNER उपयोगकर्ता प्रोफाइल पर users.id = profiles.user_id पर जुड़ें WHERE (users.disabled = 0 और profiles.hidden = 0) SELECT * FROM 'प्रोफाइल' WHERE (` प्रोफाइल '। User_id = 1) ORDER BY full_name ASC LIMIT 1 SELECT * FROM' प्रोफाइल 'WHERE (`प्रोफाइल'.user_id = 2) ORDER BY full_name ASC LIMIT 1 SELECT * FROM' प्रोफाइल 'WHERE (` प्रोफाइल'.user_id = 3 ) ORDER BY full_name ASC LIMIT 1 SELECT * `से प्रोफाइल 'WHERE (` प्रोफाइल'.user_id = 4) ORDER BY full_name एएससी सीमा 1  

विविधता 4 रिकॉर्ड की सही संख्या वापस करता है, लेकिन यह भी उत्सुक-लोडिंग निर्देश की अनदेखी कर रहा है।

क्या यह स्कोप नामक क्रॉस-मॉडल के साथ एक समस्या है? शायद मैं इसे सही ढंग से नहीं प्रयोग कर रहा हूं।

क्या इस तरह की स्थिति रेल 3 से बेहतर है?

से:

संगठनों का उत्सुक लोड हो रहा है

[...] चूंकि केवल एक तालिका एक बार में लोड होती है , स्थितियां या आदेश मुख्य एक से दूसरे तालिकाओं का संदर्भ नहीं दे सकते हैं यदि यह मामला है तो सक्रिय रिकॉर्ड पहले इस्तेमाल किए गए बायां OUTER जुड़ने आधारित रणनीति पर वापस आ गया है। उदाहरण के लिए

Post.find (: all,: include = & gt; [: author,: comments],: conditions = & gt; ['comments.approved =?', True]) < / कोड>

एक एकल एसक्यूएल क्वेरी के परिणामस्वरूप लाइनों के साथ जुड़ने के साथ: बाएं OUTER comments.post_id = posts.id पर टिप्पणियां जुड़ें और लेखकों पर लिखने वाले लेखकों को जोड़ें। पद = लेखक।

मेरा मानना ​​है कि यह आपके प्रश्न का उत्तर देता है ... "बदलाव # 4" में कोई उत्सुक लोड हो रहा है क्योंकि आप अपने names_scope पर संदर्भ <संदर्भ> कोड>।


Comments

Popular posts from this blog

windows - Heroku throws SQLITE3 Read only exception -

lex - Building a lexical Analyzer in Java -

python - rename keys in a dictionary -