2011-03-07 11 views
8

मैं एक आलसी लोड संपत्ति बनाना चाहता हूं जो मॉडल पर संग्रह लौटाता है, मैं यह कैसे कर सकता हूं?मॉडल के लिए रूबी में आलसी लोड संपत्ति कैसे बनाएं?

मैं इसके लिए कोई सहयोग नहीं बनाना चाहता हूं।

तो मैं इसे संग्रह वापस करना चाहता हूं, अगर संग्रह को प्रारंभ नहीं किया गया है, तो डेटाबेस को हिट करें, पंक्तियों को वापस करें, फिर इसे प्रारंभ करें।

यदि यह एक बार चलाया जाता है, तो इसे फिर से चलाने की आवश्यकता नहीं है क्योंकि अगला पृष्ठ अनुरोध चीजों को शुरू कर देगा।

+0

आप इसे इस तरह क्यों करना चाहते हैं? यह ठीक है कि एक संगठन के लिए क्या है। – tadman

+0

@tadman b/c यह अभी तक मेरे लिए काम नहीं कर रहा है, देखें: http://stackoverflow.com/questions/5215836/could-i-add-an-association-based-on-another-association – Blankman

उत्तर

19

एक उदाहरण विशेषता जोड़ें (जैसे @my_attribute)

और फिर परिभाषित

def my_attribute 
    @my_attribute ||= initialize_my_attribute 
end 

(नोट:। initialize_my_attribute एक समारोह/विधि आप को क्रियान्वित किया है कि मूल्य तुम चाहते हो लोड होगा है)

यह कैसे काम करता है: विशेषता nil मान से शुरू होती है (हमने इसमें कुछ भी असाइन नहीं किया है)। ऑब्जेक्ट इंस्टेंस इसे सीधे एक्सेस नहीं कर सकता है, क्योंकि हमने उस पर एक विशेषता एक्सेसर परिभाषित नहीं किया है। इसके बजाए हमारे पास एक विधि है जिसमें विशेषता के समान सटीक नाम है, ताकि जब आप my_object.my_attribute पर कॉल करते हैं, तो ऐसा लगता है कि जब आप वास्तव में ऑब्जेक्ट इंस्टेंस की विधि को कॉल कर रहे हैं तो आप विशेषता का उपयोग कर रहे हैं।

विधि में क्या होता है? ||= कम हाथ

@my_attribute = (@my_attribute || initialize_my_attribute) 

@my_attribute पहले से ही महत्व है तो अगर के बराबर है कि मान दिया जाता है। अन्यथा, @my_attribute एक मान असाइन किया जाता है (और फिर लौटाया जाता है)। दूसरे शब्दों में: मान को @my_attribute में पहली बार एक्सेस किया जाएगा (और केवल पहली बार)।

और वॉयला! धीरे लोड हो रहा है।

+0

पूरी तरह से धन्यवाद प्रतिक्रिया +1 – jcollum

+0

असल में, '|| =' '@my_attribute = (@my_attribute || initiizeize_my_attribute) के लिए शॉर्टकट है, जिसका झूठा गैर-शून्य मूल्यों के संबंध में आपके उदाहरण से थोड़ा अलग व्यवहार है। – AmShaegar

+0

अच्छा बिंदु: मैंने इस प्रभाव को अपना जवाब संपादित किया। –

0

एसोसिएटेड गुण डिफ़ॉल्ट रूप से आलसी-लोड होते हैं। अपने लॉग जांचें ताकि देखें कि डेटाबेस में क्वेरी केवल तभी की जाती है जब संपत्ति का उपयोग किया जाता है।

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

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