2011-02-16 14 views
5

में रेल वृद्धि वृद्धि काउंटर पर रूबी मैं अपने उपयोगकर्ता तालिका में किसी अन्य मॉडल से काउंटर बढ़ाने की कोशिश कर रहा हूं।मॉडल

class Count < ActiveRecord::Base 
    belongs_to :user 

    after_create :update_count 

    def update_count 
     user = User.find(self.user_id) 
     user.increment(:count) 
    end 

end 

तो जब गिनती बनाई जाती है तो लक्ष्य उस उपयोगकर्ता के लिए काउंटर कॉलम बढ़ाने के लिए होगा। वर्तमान में यह उपयोगकर्ता को सृजन के बाद प्राप्त करने से इंकार कर देता है और मुझे शून्य त्रुटि मिलती है।

मैं अपने उपयोगकर्ता

यह अधिकार (सबसे अच्छा अभ्यास) जगह यह करने के लिए है के लिए वसीयत उपयोग कर रहा हूँ? मैंने इसे नियंत्रकों में काम किया था, लेकिन इसे साफ करना चाहता था।

मैं मॉडल कॉलबैक के साथ बहुत अनुभवहीन हूं।

+0

क्या आप गणना ऑब्जेक्ट बनाने के लिए उपयोग कर रहे कोड को जोड़ सकते हैं? आप अपना लक्ष्य या व्यावसायिक मामला शामिल करना चाह सकते हैं, अन्यथा उन उत्तरों के लिए तैयार रहें जो आप जो कर रहे हैं उसे दोबारा करने की कोशिश कर रहे हैं। – gmoore

+0

मैं समझता हूं, मैं मॉडल को सामान्य बनाना चाहता हूं और स्थिति को सरल बनाना चाहता हूं। उपयोगकर्ता की_मुनी गणना है जहां प्रत्येक उपयोगकर्ता प्रविष्टि में एक कॉलम होता है जो उनकी सृजन (user.count) पर गणना का ट्रैक रखता है। – febs

उत्तर

11

तो User कई Counts है और CountUser के अंतर्गत आता है (जैसे कि यह हो रहा है), तो आप एक counter cache उपयोग करने के लिए चाहते हो सकता है। यह वही करता है जो आप करना चाहते हैं, और यह ActiveRecord में अंतर्निहित है।

+0

आह मैं देखता हूं कि मुझे उस कार्यक्षमता से अवगत नहीं था। मैं उसे एक शॉट दूंगा! – febs

+2

पूरी तरह से काम किया। रेल इसे बहुत आसान बनाते हैं :) – febs

0

मुझे लगता है कि इसके लिए एक बेहतर जगह observer का उपयोग करेगी जो उपयोगकर्ता ऑब्जेक्ट्स के लिए ऑन_क्रेट के लिए सुनती है, और फिर यह तर्क चलाती है।

कुछ की तरह:

class UserObserver < ActiveRecord::Observer 
    def after_create(user) 
    Counter.find_by_name("user_count").increment 
    end 
end 
+0

दिलचस्प समाधान, मैं काउंटर कैश और पर्यवेक्षकों दोनों के साथ प्रयोग करूंगा। – febs

0

यदि आप अधिक एक्स्टेंसिबल काउंटर कैश चाहते हैं, तो counter_culture देखें। यह मूल काउंटर कैश कार्यक्षमता का समर्थन करता है, लेकिन आपको विभिन्न स्थितियों को पूरा करने वाले रिकॉर्ड के काउंटर बनाने की भी अनुमति देता है। उदाहरण के लिए, आप आसानी से इस तरह के कोड के साथ एक निष्क्रिय उपयोगकर्ता गिनती बना सकते हैं:

class Product < ActiveRecord::Base 
    belongs_to :category 
    counter_culture :category, :column_name => \ 
    Proc.new {|model| model.inactive? ? 'inactive_count' : nil } 
end