2014-06-11 12 views
9

काम नहीं कर नष्ट चलो कहते हैं कि मैं तीन सक्रिय रिकॉर्ड मॉडल हैं:बहुरूपी निर्भर रेल: सही ढंग से

class Tissue 
    has_many :boogers, as: :boogerable, dependent: :destroy 
end 

class Finger 
    has_many :boogers, as: :boogerable, dependent: :destroy 
end 

Class Boogers 
    belongs_to :boogerable, polymorphic: true 
end 

मान लीजिए कि अपने आवेदन के लिए एक ऊतक के लिए एक उंगली से एक booger हस्तांतरण कर सकते हैं, और एक बार यह हो जाने पर दो, उंगली नष्ट हो गया है (यिक्स!)। किसी कारण से, जब उंगली नष्ट हो जाती है, तो यह उन बूगर्स को भी नष्ट कर रहा है जो पहले से संबंधित थे और तब से ऊतक में स्थानांतरित हो गए थे। लॉग में मैं देख सकता हूं कि जब उंगली नष्ट हो जाती है तो यह उन बूगर्स की आईडी को याद करता है जो इसका उपयोग करते हैं और उन्हें नष्ट कर देते हैं। यह सुनिश्चित करने के लिए जांच नहीं करता है कि boogerable_type अभी भी 'उंगली' है और इस प्रकार प्रकार 'ऊतक' वाले लोगों को नष्ट कर देता है।

जब एक उंगली नष्ट हो जाता है, यह इस कर रही है:

DELETE FROM boogers WHERE booger.id = 387 

यह इस जब करना चाहिए:

DELETE FROM boogers WHERE boogerable_id = 1 AND boogerable_type = 'finger' 

किसी को भी करने से पहले इस पार चलो?

+0

कृपया हमें वह कोड दिखाएं जहां आप स्थानांतरित कर रहे हैं और नष्ट कर रहे हैं। –

+0

आपका प्रश्न उपयोगी है, यह मेरे लिए काम करता है। –

उत्तर

6

सबसे पहले, आपको यह जानना होगा कि ActiveRecord destroy विधि ऑब्जेक्ट के :id फ़ील्ड का उपयोग करती है जब इसे नष्ट करने की आवश्यकता होती है। और dependent: :destroy विकल्प वर्तमान ऑब्जेक्ट के साथ समेकित सभी ऑब्जेक्ट्स पर destroy विधि को ट्रिगर करेगा।

मुझे लगता है कि आप कुछ इस तरह कर रहे हैं:

f = Finger.find(finger_id) 
t = Tissue.find(tissue_id) 

f.boogers[0].boogerable = t 
f.boogers[0].save! 

f.destroy 

dependent: :destroy बयान का मतलब है कि जब destroyf आह्वान किया जाता है, यह भी है कि f के साथ जुड़े रहे सभी boogers का आह्वान किया जाएगा। और f और उसके बूगर्स को स्मृति में लोड किया गया है, f.booger[0] ऑब्जेक्ट अभी भी f.boogers की सरणी में मौजूद है जिसमें नष्ट होने पर नष्ट हो जाएगा, जिसमें boogers[0] समेत इसके प्रत्येक तत्व होंगे।

इस मामले के समाधान है कि आप f.boogers.reload मारा बुला f.destroy से पहले सरणी अद्यतन करने के लिए है।

और कृपया ध्यान रखें कि जब आप f नष्ट, सभी जुड़े boogersdestroy एड के रूप में अच्छी तरह से हो जाएगा, जो वास्तव में आप क्या चाहते है? सभी शेष boogers के साथ उंगली को नष्ट करें जब उनमें से एक को किसी और स्थानांतरित कर दिया जाता है?

+3

रीलोड के साथ सरणी को अद्यतन करना समाधान था! बहुत बहुत धन्यवाद। सीधे चेहरे के साथ जवाब देने के लिए अतिरिक्त अंक। –

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