2011-06-25 21 views
9

उत्सुक लोड करने के लिए प्रलेखन में यह कहा गया है कि:आप सीमाओं के साथ उत्सुक लोडिंग कैसे करते हैं?


यदि आप उत्सुक लोड एक निर्दिष्ट के साथ जुड़ाव: सीमा विकल्प, यह ध्यान नहीं दिया जाएगा सभी संबद्ध वस्तुओं लौटने:

class Picture < ActiveRecord::Base 
    has_many :most_recent_comments, :class_name => 'Comment', 
            :order => 'id DESC', :limit => 10 
end 

चित्र.फिंड (: पहला,: शामिल =>: most_recent_comments) .most_recent_comments # => सभी संबंधित टिप्पणियां देता है।


यदि ऐसा है तो लोडिंग पर "सीमा" प्राप्त करने का सबसे अच्छा तरीका क्या है?

मान लें कि हम पिछले 10 ब्लॉग पोस्ट को ब्लॉग के सामने वाले पृष्ठ पर लोड करने के लिए उत्सुक हैं, हम स्पष्ट रूप से नहीं चाहते हैं कि पोस्ट संग्रह की सीमा और क्रम को निर्दिष्ट किया जाए?

इसके अलावा, क्या कोई गहरा भार वाले तत्वों पर समान स्थितियों को निर्दिष्ट कर सकता है - उदाहरण के लिए केवल प्रत्येक ब्लॉग पोस्ट पर पहली तीन टिप्पणियां दिखाएं?

Blog.find(:blog_id, :include => {:posts => :comments }) 
+1

इस जवाब पर एक नजर डालें ... http://stackoverflow.com/questions/9808674/rails-eager-load-and-limit – user1896290

उत्तर

0

आप इस निर्माण का उपयोग कर सकते हैं: Picture.find(:first, :include => :most_recent_comments).most_recent_comments.limit(10)

AR guide

+6

पैटर्न आप का वर्णन किया है मूल प्रश्न को सीमित नहीं करता, केवल डेटा ही इससे लौटा। चुनौती मूल क्वेरी को प्रतिबंधित करना है जैसे कि यह ब्लॉग पोस्ट के ** ** ** को स्मृति में लोड नहीं करता है –

4

मेरा मानना ​​है कि इस वजह से एसक्यूएल में LIMIT आदेश तुम क्या करने कोशिश कर रहे हैं करने के लिए अच्छी तरह से अनुवाद नहीं करता है में और अधिक देखें। LIMIT क्वेरी द्वारा लौटाई गई कुल पंक्तियों को सीमित कर देगा। आप हालांकि ऐसा करने की कोशिश नहीं कर रहे हैं। आप लौटाई गई प्रत्येक तस्वीर के लिए पंक्तियों की संख्या को सीमित करने की कोशिश कर रहे हैं। इस प्रभाव को प्राप्त करने के लिए आपको कुछ जटिल एसक्यूएल का उपयोग करना होगा, यदि आपकी टेबल बड़ी हैं तो ऑप्टिमाइज़ करना मुश्किल हो सकता है। उस समय मैं विचार करता हूं कि आप पंक्तियों को सीमित करने वाली पंक्तियों को सीमित करने की कोशिश क्यों कर रहे हैं।

यदि उत्सुक लोड की गई टिप्पणियों की अधिकतम संख्या प्रबंधनीय है (< 2000 या तो), तो आपको शायद एसक्यूएल एंड पर सीमित होने की चिंता न करें।

यदि आप केवल 10 पोस्ट लोड कर रहे हैं, तो मैं बिल्कुल भी उत्सुक लोडिंग पर विचार नहीं करूंगा। मैं चीजों को धीमा करने के लिए अतिरिक्त 10 प्रश्नों की अपेक्षा नहीं करता, और उन्होंने कितनी बार जोड़ा, आप कैशिंग जैसे अन्य अनुकूलन तकनीकों को आजमा सकते हैं।

आपको स्कॉप्स को आपके लिए गंदी काम करने देना चाहिए, न कि आकलन। यह पुन: प्रयोज्यता, रखरखाव, पठनीयता को बढ़ावा देता है।उदाहरण: जब आपको उसकी आवश्यकता

Class Picture < ActiveRecord::Base 
    has_many :comments, :order => 'id DESC' do 
    def recent 
     limit(10) 
    end 
    end 
end 

इस तरह .comments है, और आप भी गुंजाइश इसे नीचे इस तरह कर सकते हैं:

@picture.comments.recent 
1

मैं will_paginate का इस्तेमाल किया है उत्सुक लोड हो रहा है के साथ मेरी मदद करने के लिए (using includes) मैं का उपयोग कर बिना एक शॉट में कई जुड़े मॉडल लोड करने के लिए है के रूप में limit

Image.includes(:user,:tags).where("user_id !=?",current_user.id).paginate(:page => params[:page], :per_page => 15) 

या (will_paginate बिना (limit का उपयोग कर)

Image.includes(:user,:tags).where("user_id !=?",current_user.id).limit(30).order("created_at ASC") 

... यह एक try..hope यह मदद करता है प्रदान करते हैं।

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