2010-04-20 10 views
7

मैंरेल, का उपयोग करते हुए जनक हटाया जा रहा है बिना हटाया जा रहा है बच्चे: has_many

class MyContainer < ActiveRecord::Base 
    :has_many MyObjects, :dependent => :destroy 
end 

मैं MyContainer को नष्ट करने के बिना कंटेनर में सभी MyObjects को हटाना चाहते है। मेरे मॉडल में :dependent => :destroy है, हालांकि मैं ऑब्जेक्ट को हटाना और फिर से बनाना नहीं चाहता क्योंकि यह धीमा है।

कुछ इस तरह काम नहीं करता:

@obj = MyContainer.find_by_id(10) 
@obj.my_objects.delete_all 

मैं यह कैसे पूरा कर सकते हैं?

उत्तर

24

delete_all एक ActiveRecord::Base वर्ग विधि है।

आपको destroy_all का उपयोग करना चाहिए। कुछ की तरह:

@container = MyContainer.find_by_id(10) 
@container.my_objects.destroy_all 

delete_all का उपयोग ठीक से तेजी से हो सकता है अगर आप देखने के लिए अपने MyContainer पहले (या अन्य सामान के लिए इसका इस्तेमाल करते हैं)

MyObject.delete_all(["my_container_id = ?", 10]) 

संपादित की जरूरत नहीं है: रेल के लिए 3

MyObject.where(my_container_id: 10).delete_all 
0

एक या इन दोनों को काम करना चाहिए:

MyContainer.find(10).my_objects.destroy_all 

MyContainer.find(10).my_objects.each(&:destroy) 
+0

निम्नलिखित उत्तरार्द्ध, समाधान का उपयोग करते हुए स्मृति में प्रत्येक वस्तु लोड और धीमी गति से किया जाएगा की तरह वस्तुओं हटा सकते हैं। शायद पहले समाधान के साथ जाना चाहते हैं। – Kosmonaut

+0

दोनों ऑब्जेक्ट को स्मृति में तत्काल के साथ। –

0

आप सीधे

MyObject.delete_all(["my_container_id=?", 10]) 

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

  • कोई संबंधित समस्या नहीं^_^