2009-11-19 16 views
51

मैं बैंग का उपयोग करने के बारे में पता लगाने की कोशिश कर रहा हूं! रिकॉर्ड सहेजने और अपडेट करने के लिए संस्करण? मैंने पढ़ा है और सुना है कि यदि आप केवल एक रिकॉर्ड सहेज रहे हैं या एक विशेषता को अपडेट कर रहे हैं, तो आपको उनकी आवश्यकता नहीं है, अगर आपको विश्वास है कि कुछ भी गलत नहीं होना चाहिए, या हमेशा उन्हें नियंत्रक के बाहर उपयोग करना चाहिए। मुझे लगता है कि मैं कई चीज़ों को सहेजने के बारे में पागल हूं तो कुछ विफल रहता है तो डीबी में अपूर्ण डेटा होता है। वर्तमान रेल परियोजना जिस पर मैं काम कर रहा हूं, 50% से अधिक पूर्ण है और वर्तमान में इसमें कोई बैंग नहीं है। मेरे पास कुछ कस्टम विधियां हैं जिन्हें मैं मॉडल में बुला रहा हूं जो कई रिकॉर्ड अपडेट या बनाते हैं और चिंता करते हैं कि क्या उन्हें किसी प्रकार के लेनदेन में होना चाहिए।मैं कब बचाता हूं !, बनाएं! और update_attributes! रेल में?

क्षमा करें अगर यह बिखरा हुआ लगता है लेकिन मैं सिर्फ यह समझने की कोशिश कर रहा हूं कि ActiveRecord में बचत क्षमताओं का सही तरीके से उपयोग कैसे करें और अंत में मेरे जीवन को आसान और थोड़ा अधिक तनाव मुक्त करें। आपके समय के लिए धन्यवाद।

उत्तर

49

आम तौर पर आप अपने नियंत्रकों में गैर धमाके संस्करणों का उपयोग करना चाहते हैं - http://api.rubyonrails.org/classes/ActiveRecord/Base.html

का उपयोग करते हुए लेन-देन भी जांच कर रहे लायक कुछ हो सकता है। यह इस तरह तर्क अनुमति देता है:

def update 
    @model = Model.find params[:id] 
    if @model.update_attributes params[:model] #returns true of false 
    # handle success 
    else 
    # handle failure 
    end 
end 

मैं अपने आप को धमाके के संस्करणों टेस्ट मैचों में एक बहुत का उपयोग करते समय मुझे यकीन है कि मैं जानता हूँ कि अगर कुछ मान्य नहीं करता बनाना चाहते मिल जाए, और सहेजा नहीं गया है। मैंने निश्चित रूप से समय डिबगिंग परीक्षण बर्बाद कर दिए हैं जो बदले गए मॉडल सत्यापनों के कारण विफल रहे थे, जो स्पष्ट होगा कि अगर मैंने बैंग संस्करणों का उपयोग किया था।

उदा।

it "should do something" do 
    m = Model.create! :foo => 'bar' # will raise an error on validation failure    
    m.should do_something 
end 

डेटाबेस में अमान्य डेटा नहीं होने के मामले में, आप ActiveRecord सत्यापन के साथ इस से निपटने की जानी चाहिए (उदाहरण के लिए validates_presence_of :user_id), या मॉडल में अपने स्वयं के validate विधि को परिभाषित। (http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html) यदि आपका डेटा मान्य नहीं है तो इसे रोकने से बचा जाना चाहिए। यदि आप वास्तव में पागल हैं तो आप अपने डेटाबेस में कुछ बाधा डाल सकते हैं। अपने माइग्रेशन में अद्वितीय अनुक्रमणिका और अन्य डेटाबेस बाधाओं को सेट अप करने के लिए ActiveRecord::Migration दस्तावेज़ देखें।

इसके अलावा मेरे अनुभव में आप किसी भी कस्टम सेव का उपयोग करने से बचाना चाहते हैं या जब भी संभव हो विधि बना सकते हैं। यदि आप ActiveRecord में शामिल कार्यक्षमता को फिर से कार्यान्वित करते हैं तो आप सड़क के नीचे कीमत चुकाते हैं। http://matthewpaulmoore.com/post/5190436725/ruby-on-rails-code-quality-checklist पर इस पर और कुछ कहना है।

67

मुख्य अंतर यह है कि कैसे बचाया जाता है बचाता है। जब ActiveRecord क्लास को अद्यतन किया जाता है तो ! संस्करण अपवाद बढ़ाएगा यदि रिकॉर्ड अमान्य है।

मैं यहाँ डॉक्स पढ़ने की सलाह - http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html

+16

चयनित उत्तर के विपरीत, दोनों के बीच महत्वपूर्ण अंतर को इंगित करने के लिए बढ़िया। – ifightcrime

+0

लेनदेन के उपयोग को इंगित करने के लिए धन्यवाद, वे अक्सर अनदेखा लगते हैं। – ki4jnq

+2

+1। यह भी ध्यान देने योग्य होगा कि लेन-देन में गैर-बैंग विधियां चुपचाप विफल हो जाएंगी, इसलिए जब आपका कोड लेन-देन में लपेटा जाता है तो हमेशा 'सेव करें!', 'Update_attributes!' आदि का उपयोग करें। –

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