2010-04-20 2 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_allActiveRecord::Base 클래스 방법이다.

destroy_all을 사용해야합니다. 뭔가 같이 :

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

delete_all를 사용하여 당신은 당신의 MyContainer 첫 번째 (또는 다른 물건을 사용)

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

EDIT를 조회 할 필요가없는 경우 제대로 빨리 될 것입니다 : 레일 용 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]) 
관련 문제