2012-07-21 14 views
5

पर विधि को परिभाषित करें मैं एक ActiveRecord संबंध पर एक कस्टम विधि को परिभाषित करना चाहते, जैसे:ActiveRecord संबंध

Transaction.all.summed_values 

एक साधारण उदाहरण होगा जहां summed_values संबंध पर sum(:value) मूल्यांकन करना चाहिए।

मैं कहाँ विधि summed_values परिभाषित करना चाहिए? ऐसा लगता है कि यह ActiveRecord::Relation पर होना चाहिए। अगर यह सीधे वहां होना चाहिए, तो मुझे इसे किस फाइल में रखना चाहिए?

इसके अलावा, इस नई विधि केवल Transaction रों के लिए अर्थ गया है, वहाँ किसी भी तरह से केवल ActiveRecord::Relation कि Transaction रों से मिलकर बनता है के लिए इस विधि को परिभाषित करने के रेल बताने के लिए है?

+0

आप सीधे 'sum' एक रिलेशन पर,' Transaction.sum की तरह उपयोग कर सकते हैं 'ActiveRecord :: गणना द्वारा प्रदान की http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html –

उत्तर

7

लेनदेन मॉडल में सीधे एक self.summed_values विधि बनाएँ।

+0

यह काम करेंगे। आप एक दायरे का भी उपयोग कर सकते हैं। –

+0

तंजेब: मेरी माफ़ी। कृपया अपना प्रश्न संपादित करें और मैं अपना डाउनवोट हटा दूंगा! – Peter

+1

मुझे समझ में नहीं आया कि 'लेनदेन' के लिए कक्षा विधि जोड़ना संबंध पर काम करेगा। धन्यवाद! – Peter

1

क्या कोई विशिष्ट कारण है कि आप ActiveRecord :: Relation के विस्तार के रूप में इस विधि को बनाना चाहते हैं? मैं बहुत की तरह एक वर्ग विधि का प्रस्ताव होगा:

class Transaction ... 
    def self.summed_values(transactions=nil) 
    if transactions.nil? 
     all.sum(...)... 
    else 
     where(id => transactions).sum(...)... 
    end 
    end 
end 

यह भी लाभ है कि यह लेन-देन के लिए ही उपलब्ध है।

+0

यह स्पष्ट रूप से पढ़ा नहीं जाता है या मेरे अर्थ के साथ-साथ समाधान के बाद भी नहीं पढ़ता है। जिस विधि को मैं विशेष रूप से कॉल करना चाहता हूं, वह अवधारणात्मक रूप से और कार्यान्वयन दोनों में संबंध वस्तु पर है। मैं सहमत हूं कि यह काम करेगा, लेकिन यह मेरे बाद नहीं है। – Peter

+0

मुझे यकीन नहीं है कि आप इसे ActiveRecord :: रिलेशन ऑब्जेक्ट पर क्यों पसंद करेंगे और फिर भी यह केवल लेनदेन पर लागू होता है। एकमात्र तार्किक दृष्टिकोण संबंध को कम करने के लिए होगा और इसके बजाय लेनदेन आपके उप-वर्ग का उपयोग करेगा, और मुझे नहीं लगता कि यह किसी भी माध्यम से क्लीनर है। –

+0

मैं पहले समझ में नहीं आया कि यह कैसे काम किया, और नहीं पता था कि आप 'Transaction' करने के लिए एक वर्ग विधि जोड़ सकते हैं और यह संबंध पर काम करेगा। मुझे समझने में मदद करने के लिए धन्यवाद ... – Peter

1

आप

Transaction.all.extending do 
    def summed_values 
    sum(:what_you_want) 
    end 
end 

विस्तार का उपयोग करना चाहिए और अधिक जानकारी के लिए: (: मूल्य) ActiveRecord::QueryMethods