2012-03-26 12 views
11

मैं निम्नलिखित मॉडल संघों फायरिंग नहीं नष्ट:before_destroy और आश्रित

class Slider < ActiveRecord::Base 
    has_one :featured_happening, :as => :featured_item, :dependent => :destroy 
    before_destroy :destroy_featured_happening 
    after_create :create_featured_happening 
end 

class FeaturedHappening < ActiveRecord::Base 
    belongs_to :featured_item, :polymorphic => true 
end 

जब मैं एक Slider वस्तु को नष्ट मैंने सोचा था कि dependent => :destroy स्वचालित रूप से featured_item को नष्ट कर देगी लेकिन ऐसा नहीं है।

स्लाइडर नियंत्रक

def destroy  
    slider = Slider.find(params[:id]) 
    slider.delete 
    render(:status => :ok, :nothing => true) 
    end 

तो फिर मैं before_destroy साथ एक कॉलबैक करने की कोशिश की जब एक स्लाइडर वस्तु नष्ट हो जाता है और कुछ भी नहीं कहा जाता हो रही है मैन्युअल featured_item नष्ट करने के लिए।

जब मैं स्लाइडर ऑब्जेक्ट हटाता हूं तो हटाए जाने के लिए featured_item कैसे प्राप्त किया जा सकता है? रेल 3.2 का उपयोग करना।

+0

आप 'स्लाइडर' उदाहरण को कैसे हटा रहे हैं? –

+0

डीईएफ़ स्लाइडर = Slider.find ([: id] पैरामीटर) को नष्ट slider.delete प्रस्तुत करना (: स्थिति =>: ठीक है,: कुछ भी नहीं है => true) अंत – chell

उत्तर

19

आपने अभी delete और destroy के बीच का अंतर देखा है। अपने नियंत्रक में आप

slider.delete 

जो सिर्फ एक एसक्यूएल DELETE निष्पादित करेगा, लेकिन किसी भी कॉलबैक फोन नहीं होगा कहते हैं। यही कारण है कि आप सामान्य मामलों में destroy का उपयोग करना चाहते हैं। यह वस्तु (यदि आवश्यक हो) लाएगा, कॉलबैक को रिकर्सिव विध्वंस सहित कॉल करें और केवल तब डेटाबेस से ऑब्जेक्ट को हटा दें।

अधिक जानकारी के लिए delete और destroy के लिए प्रलेखन देखें।

+0

Geez, अच्छी तरह से उल्लेख किया। मैंने हमेशा सोचा कि एक दूसरे का उपनाम था। धन्यवाद। –

4

सुनिश्चित करें कि आप कॉलबैक ट्रिगर करने के लिए Slider#destroy पर कॉल कर रहे हैं। Slider#delete उन्हें कॉल किए बिना रिकॉर्ड हटा देगा।

0
class Slider < ActiveRecord::Base 
    has_one :featured_happening, :dependent => :destroy 
end 

class FeaturedHappening < ActiveRecord::Base 
    belongs_to :featured_item 
end 

यदि आपका कोड ऊपर जैसा सरल था जिसमें सरल संबंध है। फिर स्लाइडर को हटाने के साथ, स्लाइडर हटाना स्लाइडर को हटाने के साथ हटा दिया जाएगा। लेकिन आपके मामले में संबंध polymorphic है। डीबी में सुविधा खुशी तालिका में abject_id स्लाइडर की आईडी होगी या कुछ अन्य वर्ग हो सकती है। इसलिए आश्रित: काम नहीं कर नष्ट करो। तो आपको इसे पहले_डेस्ट्राय कॉलबैक के साथ हटाने की आवश्यकता होनी चाहिए जिसमें आप पहले रिकॉर्ड्स पुनर्प्राप्त करते हैं और फिर उन्हें

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