2011-12-06 4 views
9

मेरे पास एक ActiveRecord मॉडल है जिसमें एक लंबा स्ट्रिंग फ़ील्ड है। असल में, यह स्ट्रिंग एक सरणी का प्रतिनिधित्व करती है जिसे मैं संपूर्ण स्ट्रिंग की प्रतिलिपि बनाने के बजाय जगह में संशोधित करना चाहता हूं।क्या स्ट्रिंग फ़ील्ड को जगह में संशोधित करते समय मैं मॉडल को सहेजने के लिए ActiveRecord को मजबूर कर सकता हूं?

उदाहरण के लिए कहें Somemodel में एक स्ट्रिंग फ़ील्ड array है। उसके बाद निम्न को बचाने के लिए विफल रहता है:

m = Somemodel.first 
m.array[someindex] = somevalue 
m.save 

वास्तव में, save रिटर्न यह द्वारा सही array ही object_id है और तय करता है कि मॉडल नहीं बदला है और डेटाबेस के लिए गोल यात्रा को छोड़ देता है कि जाँच करने के लिए लगता है। है

m = Somemodel.first 
a = String.new(m.array) # remember, the array is represented as a string 
a[someindex] = somevalue 
m.array = a 
m.save 

ध्यान दें कि m.array अपने मूल्य को संशोधित करने के बाद स्थापित किया जाना है क्योंकि save मूल्य पर और न केवल object_id दिखता है:

मैं निम्नलिखित तरीके को का उपयोग कर समाप्त हो गया।

यह बोझिल लगता है और पूरे स्ट्रिंग की प्रतिलिपि बनाने की आवश्यकता है। बड़ी सरणी के लिए अच्छा नहीं है। क्या मैं save को इन-मॉडल-संशोधित चेक को पूर्ववत सत्यापन परीक्षणों के बिना बाईपास कर सकता हूं? http://api.rubyonrails.org/classes/ActiveModel/Dirty.html:

उत्तर

13

शायद यह आप के लिए क्या देख रहे है एक विशेषता में जगह संशोधित किया गया है

तो [ATTRIBUTE_NAME] _will_change का इस्तेमाल करते हैं! यह चिह्नित करने के लिए कि विशेषता बदल रही है।

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

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