2012-07-16 13 views
31

मेरे पास एक चित्र मॉडल है जिसमें दृश्य गणना (पूर्णांक) के लिए एक चर शामिल है। प्रत्येक बार कोई चित्र ऑब्जेक्ट देखने पर दृश्य गणना +1 द्वारा बढ़ी जाती है।.increment बनाम + = 1

इस करवाने में,

@picture.view_count += 1 
    @picture.save 

और

@picture.increment(:view_count, by = 1) 
भी

अगर मैं वेतन वृद्धि का उपयोग करें, .save आवश्यक है के बीच क्या अंतर है?

+1

वाक्य रचना नहीं करना चाहिए '@ picture.increment (: VIEW_COUNT, 1)'? –

+0

समवर्तीता से अवगत रहें !! इस मामले में आपके दोनों समाधान सुरक्षित नहीं हैं! कल्पना करें कि दो उपयोगकर्ता एक ही समय में कोड चलाते हैं। दोनों एक ही 'view_count' मान के साथ काम करते हैं। फिर दूसरा उपयोगकर्ता सहेजने वाले पहले उपयोगकर्ता के मान को ओवरराइट करता है और अंतिम गणना अपेक्षा से कम होती है। इससे बचने के लिए आपको 'increment_counter' का उपयोग करना चाहिए। –

उत्तर

45

increment का स्रोत नीचे है, जो शून्य पर विशेषता को प्रारंभ करता है और शून्य के रूप में पारित मान जोड़ता है (डिफ़ॉल्ट 1 है), यह सहेजता नहीं है, इसलिए .save अभी भी आवश्यक है।

def increment(attribute, by = 1) 
    self[attribute] ||= 0 
    self[attribute] += by 
    self 
end 
+24

या आप 'increment!' विधि का उपयोग कर सकते हैं यदि आप इसे मैन्युअल रूप से सहेजना नहीं चाहते हैं –

+2

यह थोड़ा दिनांकित है, नई विधि increment_counter – timroman

+0

क्या आपको लगता है कि इस वृद्धि की चीज़ को संबंध के साथ स्कॉप्ड किया जा सकता है? पोस्ट has_many छवियों, छवि मॉडल में एक स्थिति विशेषता है जिसे – Ben

4

आपको counter_cache का उपयोग करना चाहिए। counter_cache आपको स्वचालित रूप से रिकॉर्ड्स की संख्या बढ़ाने में मदद करता है।

class Picture < ActiveRecord::Base 
    has_many :views 
end 

class View < ActiveRecord::Base 
    belongs_to :picture, counter_cache: true 
end 

चित्रों तालिका नाम views_count साथ स्तंभ की जरूरत है, या आप उदाहरण के लिए, इस स्तंभ के लिए अपने स्वयं के नाम का उपयोग कर सकते हैं:

belongs_to :picture, counter_cache: :number_of_views 

लेकिन मैं तुम्हें counter_cache स्तंभ जो views_count है के लिए डिफ़ॉल्ट नाम का उपयोग करने की सलाह देते हैं ।

+0

कि ' डी के लिए एक मॉडल की आवश्यकता है? या यह "अमूर्त" हो सकता है? – Ben

20

मैं अक्सर उस मामले में counter_cache और increment_counter का उपयोग करता हूं।

इस तरह:

Picture.increment_counter(:view_count, @picture.id) 

इस तरह अधिक सरल और स्व-निर्मित विधि की तुलना में तेजी है।

संयोग से, ActiveRecord :: काउंटर कैश भी decrement_counter है।

http://api.rubyonrails.org/classes/ActiveRecord/CounterCache/ClassMethods.html

+2

यह सबसे अच्छा जवाब है, क्योंकि यह समवर्तीता का ख्याल रखता है। –

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