2010-05-30 15 views
5

मेरे पास एक ActiveRecord मॉडल ऑब्जेक्ट Foo है; यह एक मानक डेटाबेस पंक्ति का प्रतिनिधित्व करता है।एक उदाहरण पर ActiveRecord save() को रोकना

मैं इस ऑब्जेक्ट के उदाहरणों के संशोधित संस्करणों को प्रदर्शित करने में सक्षम होना चाहता हूं। मैं कक्षा को फिर से उपयोग करना चाहता हूं, क्योंकि इसमें पहले से ही सभी हुक & पहलुओं की आवश्यकता होगी। (उदाहरण के लिए: मेरे पास पहले से एक ऐसा दृश्य है जो उचित विशेषताओं को प्रदर्शित करता है)। असल में मैं मॉडल उदाहरण क्लोन करना चाहता हूं, इसकी कुछ गुणों को संशोधित करना चाहता हूं, और उसे कॉलर (देखें, परीक्षण, आदि) पर वापस फ़ीड करना चाहता हूं।

मैं नहीं चाहता हूं कि ये विशेषता संशोधन डेटाबेस में वापस आ जाए। हालांकि, मैं क्लोन संस्करण में id विशेषता शामिल करना चाहता हूं, क्योंकि यह मार्ग-सहायकों से निपटने में बहुत आसान बनाता है। इस प्रकार, मैं ActiveRecord::Base.clone() पर कॉल करने की योजना बना रहा हूं, मैन्युअल रूप से क्लोन आवृत्ति की आईडी सेट कर रहा हूं, और उसके बाद उचित विशेषता को नए उदाहरण में बदलना चाहता हूं। यह मुझे चिंतित है हालांकि; संशोधित उदाहरण पर एक save() और मेरा मूल डेटा क्लॉब्ड हो जाएगा।

तो, मैं नया उदाहरण लॉक करना चाहता हूं ताकि इससे कुछ और नुकसान न आए। मैं पहले से ही freeze() पर कॉल करने की योजना बना रहा हूं (इस समझ पर कि यह ऑब्जेक्ट में और संशोधन को रोकता है, हालांकि documentation isn't terribly clear)। हालांकि, मुझे बचाने() को रोकने के लिए कोई स्पष्ट तरीका नहीं दिख रहा है।

इसे प्राप्त करने का सबसे अच्छा तरीका क्या होगा?

+1

बढ़ा देंगे कर सकते हैं मानक ActiveRecord वस्तु के साथ चारों ओर है कि काफी गड़बड़ की जरूरत है, वहाँ शायद समस्या आ का एक बेहतर तरीका है। – Matchu

+0

मैं निश्चित रूप से विकल्पों के लिए खुला हूं –

उत्तर

4

ऐसा करने के लिए एक और बेवकूफ तरीका हो सकता है, लेकिन एक तरीका वर्चुअल विशेषता सेट करना होगा और इसे before_save कॉलबैक में जांचना होगा। जब आप ऑब्जेक्ट क्लोन करते हैं, तो वर्चुअल एट्रिब्यूट सेट करें - शायद is_clone से true पर कुछ। फिर अपने मॉडल वर्ग के लिए before_save कॉलबैक को परिभाषित करें जो उस विशेषता को सेट करते समय सहेजने से बचाता है।

4

freeze() एक बदसूरत तरीके से, जो मैं चाहता हूं उसे प्राप्त करने के लिए प्रतीत होता है।

x = Factory.create(:my_model) 
x.save! # true 
x.freeze 
x.save! 
TypeError: can't modify frozen hash 

मुझे लगता है कि बचाने के अनुमान लगा रहा हूँ() बनाया/संशोधित गुण अद्यतन करने के लिए है, जो विफल रहता है क्योंकि गुण हैश जमी कोशिश कर रहा है।

तो, फ्रीजिंग बचत को रोक देगा ... लेकिन मैं एक और अधिक विशिष्ट त्रुटि संदेश के साथ एक और अधिक विश्वसनीय विधि की सराहना करता हूं।

+2

बस स्पष्ट करने के लिए, फ्रीज उदाहरण को संशोधित करने से रोक देगा, जबकि केवल पढ़ने के लिए! संशोधनों की अनुमति देगा लेकिन संशोधित उदाहरण को डेटाबेस में सहेजा जा सकता है। –

+0

अद्यतन @ डेविड एल्ड्रिज के लिए धन्यवाद; मैंने अपना स्वीकार्य उत्तर बदल दिया है। –

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