2012-02-17 13 views
6

मैंने व्यवहार को ओवरराइट करने के लिए बहुत सी चीजों की कोशिश की: विधियों को नष्ट करें लेकिन कुछ भी काम नहीं करता है। मैंने पहले act_as_paranoia प्लगइन का उपयोग किया था, लेकिन यह has_many में एक मॉडल के साथ काम नहीं करता है: एसोसिएशन के माध्यम से।रेल: ओवरराइट कैसे करें: विधि को नष्ट करें?

मैं अधिलेखित करना चाहते हैं: विधि को नष्ट सिर्फ इस तरह कुछ करने के लिए:

def destroy 
    _run_destroy_callbacks { delete } 
    end 

    def delete  
    self.update_attribute(:status => 0) 
    freeze 
    end 

है यही कारण है कि, मैं बस के बजाय रिकॉर्ड खुद को नष्ट करने का (0 करने के लिए स्थिति) एक और क्षेत्र को अपडेट करना चाहते।

उत्तर

5

आप की कोशिश की है ?:

class MyClass < ActiveRecord::Base 
    def destroy 
    update_attribute(:status, 0) 
    end 
end 

संपादित करें: टिप्पणी के आधार पर, वहाँ काम पर कुछ और हो सकता है और यह सिर्फ हो सकता है (: निर्भर => '') संघ परिभाषा पर पद - या यदि यह एक एचएबीटीएम है, तो यह बिल्कुल काम नहीं कर सकता है। शायद this info on delete and destroy through associations मदद करेगा? नीचे प्रासंगिक अनुभाग चिपकाया गया:

हटाएं या नष्ट करें?

has_many और has_and_belongs_to_many एसोसिएशन के पास विधियां नष्ट, हटाएं, नष्ट करें और हटाएं_ हटाएं।

has_and_belongs_to_many के लिए, हटाएं और नष्ट करें समान हैं: वे शामिल तालिका में रिकॉर्ड्स को हटाए जाने का कारण बनते हैं।

has_many के लिए, नष्ट हमेशा रिकॉर्ड की नष्ट विधियों को कॉल किया जाएगा ताकि कॉलबैक चलाए जा सकें। हालांकि हटाएं द्वारा निर्दिष्ट रणनीति के अनुसार हटाएं: आश्रित विकल्प, या यदि नहीं: निर्भर विकल्प दिया गया है, तो यह डिफ़ॉल्ट रणनीति का पालन करेगा। डिफ़ॉल्ट रणनीति है: nullify ( विदेशी कुंजी को शून्य करने के लिए सेट करें), has_many को छोड़कर: जहां डिफ़ॉल्ट रणनीति delete_all है ( कॉलबैक चलाने के बिना, शामिल होने वाले रिकॉर्ड हटाएं)।

+0

हां, यह पहली बात थी जिसकी मैंने कोशिश की थी। यह कुछ भी नहीं करता है। मैं अपने लॉग में अनुरोध से हटा सकते हैं। कस्टम नष्ट विधि को नहीं कहा जाता है। –

+0

एचआरएम, मैं वास्तव में कई ऐप्स में कई मॉडलों में इसका उपयोग करता हूं और यह असफल होने के बिना काम करता है। क्या इस विशेष मॉडल के साथ कुछ भी 'विशेष' है और क्या आप हटाना या नष्ट कर रहे हैं? आप उत्तरार्द्ध चाहते हैं। – miked

+0

रिकॉर्ड अपने माता-पिता से AREL (ActiveRecord संबंध) में नष्ट हो गया है, शायद यह समस्या है?असल में, मैं अपने शराब मॉडल और रिकॉर्ड (मुख्य रूप, नियंत्रक में अद्यतन विधि) को अद्यतन करता हूं, और यदि मैं बच्चे को हटाने का विकल्प चुनता हूं (वैरिएटल मॉडल जिसमें कस्टम नष्ट होता है), तो इसे स्पष्ट रूप से नहीं कहा जाता है। शायद, रेल तंत्र को नष्ट करने के लिए अलग है यदि यह माता-पिता बच्चे को नष्ट कर देता है (बच्चे मॉडल पर नष्ट न करें?) –

0

रूप miked ने कहा, इस कोड को अच्छा था अगर हम varietal "मैन्युअल" नष्ट करना चाहते हैं:

@varietal = Varietal.find('1')  
@varietal.destroy 

def destroy 
    update_attribute(:status, 0) 
end 

यह पूरी तरह से काम करता है। हालांकि, जैसा कि मैंने कहा था, अगर हम अभिभावक रिकॉर्ड को अपडेट करते हैं, तो मुझे बच्चे को बुलाया/नष्ट/हटाए जाने की विधि नहीं मिली ... इसलिए अगर किसी के पास कोई विचार है ...

2

मुझे लगता है कि सबसे अच्छा

def Model 
    before_destroy: mark_as_deleted 

    def mark_as_deleted 
     self.update_attribute(:status => 0) 
    end 
end 

यह destroy हालांकि रद्द नहीं होगा: यह करने के लिए जिस तरह से आश्रितों में हेरफेर करने के before_destroy: फिल्टर अधिलेखित करने के लिए है।

The full callback documentation is here

+0

यह अभी भी नियंत्रक में नष्ट() को कॉल करता है, यह केवल आपके डीफ़ के माध्यम से चलता है। लौटने पर झूठ काम नहीं करता है, कम से कम नहीं कि मैं बता सकता हूं। –

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