[Ruby-On-Rails] बिना सहेजे रेल अपडेट_ट्रिब्यूट?


Answers

आप assign_attributes या attributes= उपयोग कर सकते हैं attributes= (वे वही हैं)

अद्यतन विधियों धोखा शीट (रेल 4 के लिए):

  • update_attributes = assign_attributes + save
  • attributes= = assign_attributes उपनाम
  • update_attributes update = उपनाम

स्रोत:
https://github.com/rails/rails/blob/master/activerecord/lib/active_record/persistence.rb
https://github.com/rails/rails/blob/master/activerecord/lib/active_record/attribute_assignment.rb

एक और धोखा शीट:
http://www.davidverhasselt.com/set-attributes-in-activerecord/#cheat-sheet

Question

क्या update_attributes का कोई विकल्प है जो रिकॉर्ड को सहेजता नहीं है?

तो मैं कुछ ऐसा कर सकता था:

@car = Car.new(:make => 'GMC')
#other processing
@car.update_attributes(:model => 'Sierra', :year => "2012", :looks => "Super Sexy, wanna make love to it")
#other processing
@car.save

बीटीडब्ल्यू, मुझे पता है कि मैं @car.model = 'Sierra' कर सकता हूं, लेकिन मैं उन्हें एक पंक्ति पर अपडेट करना चाहता हूं।




सहेजे बिना ActiveRecord मॉडल के मानों के बड़े पैमाने पर असाइनमेंट के लिए, assign_attributes या attributes= विधियों का उपयोग करें। ये विधियां रेल 3 और नए में उपलब्ध हैं। हालांकि, इसके बारे में जागरूक होने के लिए मामूली अंतर और संस्करण से संबंधित गॉथस हैं।

दोनों विधियां इस उपयोग का पालन करती हैं:

@user.assign_attributes{ model: "Sierra", year: "2012", looks: "Sexy" }

@user.attributes = { model: "Sierra", year: "2012", looks: "Sexy" }

ध्यान दें कि न तो विधि मान्यताओं को निष्पादित करेगी या कॉलबैक निष्पादित करेगी; कॉलबैक और सत्यापन तब होता है जब save जाता है।

रेल 3

attributes= रेल में assign_attributes से थोड़ा अलग है 3. attributes= assign_attributes कि उस पर पारित तर्क एक हैश है, और यदि यह नहीं है तो तत्काल लौटाता है; assign_attributes में ऐसी कोई हैश चेक नहीं है। attributes= लिए ActiveRecord विशेषता असाइनमेंट API दस्तावेज़ देखें।

निम्न अमान्य कोड गुणों को सेट किए बिना बस लौटकर चुपचाप असफल हो जाएंगे:

@user.attributes = [ { model: "Sierra" }, { year: "2012" }, { looks: "Sexy" } ]

attributes= चुपचाप व्यवहार करेंगे जैसे असाइनमेंट सफलतापूर्वक किए गए थे, वास्तव में, जब वे नहीं थे।

यह अमान्य कोड अपवाद उठाएगा जब assign_attributes सरणी की हैश कुंजी को assign_attributes करने का प्रयास करता है:

@user.assign_attributes([ { model: "Sierra" }, { year: "2012" }, { looks: "Sexy" } ])

assign_attributes लिए NoMethodError अपवाद उठाएगा, यह दर्शाता है कि पहला तर्क हैश नहीं है। अपवाद स्वयं वास्तविक कारण के बारे में बहुत जानकारीपूर्ण नहीं है, लेकिन तथ्य यह है कि एक अपवाद होता है बहुत महत्वपूर्ण है।

इन मामलों के बीच एकमात्र अंतर द्रव्यमान असाइनमेंट के लिए उपयोग की जाने वाली विधि है: attributes= चुपचाप सफल होता है, और assign_attributes यह सूचित करने के लिए अपवाद उठाता है कि एक त्रुटि हुई है।

ये उदाहरण प्रत्याशित प्रतीत हो सकते हैं, और वे एक डिग्री के लिए हैं, लेकिन इस प्रकार की त्रुटि आसानी से तब हो सकती है जब किसी एपीआई से डेटा परिवर्तित हो या यहां तक ​​कि केवल डेटा परिवर्तन की श्रृंखला का उपयोग करके और Hash[] को भूलना Hash[] अंतिम परिणाम । ऊपर दिए गए कुछ कोड 50 लाइनें बनाए रखें और आपके गुण असाइनमेंट से 3 फ़ंक्शन हटा दिए जाएंगे, और आपके पास विफलता के लिए नुस्खा है।

रेल 3 के साथ सबक यह है: हमेशा attributes= बजाय assign_attributes उपयोग करें।

रेल 4

रेल 4 में, attributes= assign_attributes लिए बस एक उपनाम है। attributes= लिए ActiveRecord विशेषता असाइनमेंट API दस्तावेज़ देखें।

रेल 4 के साथ, या तो विधि का उपयोग एक दूसरे के लिए किया जा सकता है। पहले तर्क के रूप में हैश को पास करने में विफलता के परिणामस्वरूप बहुत ही उपयोगी अपवाद होगा: ArgumentError: When assigning attributes, you must pass a hash as an argument.

सत्यापन

यदि आप save लिए तैयारी में प्री-फ्लाइंग असाइनमेंट कर रहे हैं, तो आपको सहेजने से पहले सत्यापित करने में रुचि हो सकती है। आप valid? उपयोग कर सकते हैं valid? और invalid? इसके लिए तरीकों। दोनों वापसी बूलियन मूल्य। valid? अगर सहेजा गया मॉडल सभी मान्यताओं या झूठ को पास करता है तो यह सच हो जाता है अगर ऐसा नहीं होता है। invalid? क्या valid? के विपरीत valid?

valid? इस तरह इस्तेमाल किया जा सकता है:

@user.assign_attributes{ model: "Sierra", year: "2012", looks: "Sexy" }.valid?

इससे आपको कॉलिंग से पहले किसी भी सत्यापन के मुद्दों को संभालने की क्षमता मिल जाएगी।




Links