2010-04-20 12 views
7

Tôi cóRails, xoá trẻ em, không xóa Chánh sử dụng: has_many

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

Tôi muốn xóa tất cả các MyObjects trong container mà không cần phải xóa các MyContainer. Mô hình của tôi có :dependent => :destroy, tuy nhiên tôi không muốn phải xóa và tạo lại đối tượng vì nó chậm hơn.

Something như thế này không hoạt động:

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

Làm thế nào tôi có thể thực hiện điều này?

Trả lời

24

delete_all là một phương pháp ActiveRecord::Base lớp.

Bạn nên sử dụng destroy_all. Một cái gì đó như:

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

Sử dụng delete_all đúng cách sẽ nhanh hơn nếu bạn không cần phải tra cứu MyContainer đầu tiên (hoặc sử dụng nó cho các công cụ khác)

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

EDIT của bạn: cho đường ray 3

MyObject.where(my_container_id: 10).delete_all 
0

Một hoặc cả hai nên làm việc:

MyContainer.find(10).my_objects.destroy_all 

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

Sử dụng giải pháp sau sẽ tải từng đối tượng vào bộ nhớ và chậm. Có lẽ muốn đi với giải pháp đầu tiên. – Kosmonaut

+0

Cả hai đều khởi tạo từng đối tượng vào bộ nhớ. –

0

Bạn có thể xóa các đối tượng trực tiếp như sau

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