2009-07-07 15 views
39

आइटम को हटाने के बिना आप एक HABTM संबंधित आइटम को कैसे हटाते हैं?आइटम को हटाने के बिना मैं एक ही एचएबीटीएम संबंधित आइटम को कैसे हटा सकता हूं?

उदाहरण के लिए, मेरे पास 3 छात्र हैं जो एक साथ विज्ञान कक्षा में हैं। मैं वास्तविक विज्ञान संदर्भ को हटाए बिना StudentClasses तालिका से विज्ञान ऑब्जेक्ट्स को कैसे हटाऊं? मुझे लगता है कि Student.Classes.first.delete एक अच्छा विचार नहीं है।

मैं जावास्क्रिप्ट का उपयोग कर और निकालने के लिए ड्रैग-एंड-ड्रॉप के साथ प्रयोग कर रहा हूं, चेक बॉक्स नहीं। कोई विचार?

उत्तर

57

मैं has_many का उपयोग करते हैं: के माध्यम से, लेकिन आप

student.classes.delete(science) 

मैं लक्ष्य वस्तु ही नहीं, आईडी के लिए की आवश्यकता होगी, लगता है की कोशिश की है, HABTM की एक सीमा (के बाद से शामिल होने तालिका दूर निकाला जाता है आपकी सुविधा के लिए)। यदि आप has_many का उपयोग करते हैं: आप सीधे जॉइन टेबल पर काम कर सकते हैं (जब से आप एक मॉडल प्राप्त करते हैं) और इससे आपको इस तरह की चीज़ को कम प्रश्नों में अनुकूलित करने की सुविधा मिलती है।

def leave_class(class_id) 
    ClassMembership.delete(:all, :conditions => ["student_id = ? and class_id = ?", self.id, class_id) 
end 

आप HABTM की सादगी चाहते हैं तो आप फोन करने के लिए एक मॉडल "कक्षा" एक बहुत बुरा विचार है, इसके अलावा

student.classes.delete(Class.find 2) 

उपयोग करने के लिए की जरूरत है। एक नाम का प्रयोग करें जो रूबी के मूल का हिस्सा नहीं है!

+0

खैर जिस तरह से यह वर्तमान में सेट किया गया है, मैं पैरामीटर का उपयोग करना चाहिए [: class_id] प्रदर्शन करने के लिए Class.find_by_id तो का उपयोग ऐसा करने के लिए कक्षा मिली। यह अच्छा होगा अगर मैं सिर्फ "Student.class_ids.remove [2]" कह सकता हूं। –

+0

इस तरह की सोच है कि आपको has_many की आवश्यकता है: के माध्यम से। इसे प्रतिबिंबित करने के लिए उत्तर अपडेट किया गया। –

0

आप एक से अधिक जुड़े आइटम आप * का उपयोग करें और लिख सकते हैं हटाना चाहते हैं:

student.classes.delete(*classes_array) 
संबंधित मुद्दे