2010-10-25 12 views
7

संभव डुप्लिकेट:
How can I avoid running ActiveRecord callbacks?सहेजें rails3 में कॉलबैक बुला बिना active_record

रेल 2 में था वहाँ active_records पर एक निजी विधि create_without_callbacks कहा जाता है जो आप में एक रिकॉर्ड को बचाने के लिए कह सकते हैं उस ऑब्जेक्ट से जुड़े कॉलबैक को ट्रिगर किए बिना डेटाबेस। यह विधि रेल 3 में गायब हो गई है, क्या वही चीज़ हासिल करने का कोई तरीका है?

+1

यह सवाल स्पष्ट रूप से कहा रेल 3. चाहिए डुप्लिकेट रेल में वापस लिखा गया था 2 दिन, अब रेल 4 की जानकारी शामिल है, लेकिन विशेष रूप से रेल में रिकॉर्ड बनाने को संबोधित नहीं करता 3 (हालांकि इसमें रेल 3 में मौजूदा रिकॉर्ड अपडेट करने पर जानकारी शामिल है)। यह सवाल अलग और अलग है और मेरी राय में डुप्लिकेट नहीं है। – IAmNaN

उत्तर

2

आप create_without_callbacks पर कॉल करते समय कुछ व्यावसायिक तर्क होने से रोक रहे हैं। कॉलबैक को हटाने पर विचार करें यदि उनकी आवश्यकता नहीं है, या केवल :if और :unless विकल्पों का उपयोग केवल कॉलबैक को ट्रिगर करने के लिए करें।

+0

जब मैं एक वस्तु का परीक्षण करता हूं जो किसी अन्य पर निर्भर करता है तो मैं अक्सर निर्भरता का नकल करना चाहता हूं। दुर्भाग्यवश, यदि मैं करता हूं कि active_record शिकायत करता है कि नकली सही प्रकार का नहीं है। रेलों में 2 मैं कारखाने की लड़की का उपयोग कर इस प्रकार चारों ओर मिल गया ताकि सही प्रकार के प्रभावी ढंग से स्टब्स बन सकें।मैंने एक कारखाने की लड़की रणनीति को जोड़ा जो create_without_callbacks विधि का उपयोग करके एक रिकॉर्ड डाला गया क्योंकि वे अप्रासंगिक थे। – opsb

+1

मैं समझता हूं, लेकिन इस तरह आप फिर से 'वास्तविक जीवन' वस्तुओं का परीक्षण नहीं करेंगे। तो, अनिवार्य रूप से आप अपने आवेदन कोड का परीक्षण नहीं कर रहे हैं। मैं कॉलबैक सहित वैध ऑब्जेक्ट्स बनाने के लिए हमेशा ब्लूप्रिंट या फैक्टरीगर्ल का उपयोग करता हूं। – Ariejan

+0

मैं एकीकरण परीक्षण करने के लिए ककड़ी का उपयोग करता हूं। जब मैं एकमात्र 'असली' ऑब्जेक्ट का परीक्षण करता हूं जिसे मैं परवाह करता हूं वह वह है जिसे मैं परीक्षण कर रहा हूं। – opsb

-1

मुझे नहीं पता कि यह सब अभी भी आर 3 में काम करते हैं, कम से कम 2.3.8 में उन्होंने किया।

अगर यह सिर्फ एक विशेषता है तो

self.update_attribute(:attribute, value) 

यदि यह एक वस्तु पर एक से अधिक विशेषताओं

self.update_attributes({:attribute => value}) 

तुम भी कुछ शर्तों के साथ सभी रिकॉर्ड को अपडेट कर सकते है

update_all("category = 'authorized' approved = 1, author = 'David'") 

आखिरी बार मैंने रेल एपीआई से लिया, मुझे लगता है कि यह कॉलबैक नहीं बुलाता है लेकिन मुझे यकीन नहीं है।

+0

आप किसी सहेजे गए ऑब्जेक्ट पर 'update_attributes' को कॉल नहीं कर सकते हैं। लक्ष्य कॉलबैक कॉल किए बिना एक नई वस्तु बनाना है। – Ariejan

+1

हाँ, मैंने प्रश्नों में निर्माण नहीं देखा। – s84

+0

सैम के उत्तर ने मुझे –

0

रेल 3 के लिए स्रोत को देखते हुए ऐसा लगता है कि कॉलबैक इस तरह से जोड़े गए हैं कि model.save विधि वास्तव में उनके बारे में नहीं जानता है।

मैं जिस समाधान के लिए गया हूं वह मॉडल को मिटाना है और एक उदाहरण लौटाएं जो सहेजा नहीं गया है। यह वास्तव में यूनिट परीक्षण कैसे किया जाना चाहिए और वे बूट करने के लिए तेज़ दौड़ते हैं।

आप एक हैक मैं सुझाव है कि आप

  • rails3/activesupport/lib/active_support/callbacks.rb
  • rails3/activemodel/lib/active_model/callbacks.rb
  • को देखो खोजने में रुचि रखते हैं
  • रेल/activerecord/lib/active_record/callbacks.rb

उस क्रम में।

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