2010-04-20 7 views
7

que tienenrieles, la eliminación de niños sin eliminar el uso de los padres: has_many

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

Quiero borrar todo el MyObjects en el contenedor sin tener que borrar el MyContainer. Mi modelo tiene :dependent => :destroy, sin embargo, no quiero tener que eliminar y volver a crear el objeto porque es más lento.

Algo como esto no funciona:

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

¿Cómo puedo lograr esto?

Respuesta

24

delete_all es un método ActiveRecord::Base clase.

Debe usar destroy_all. Algo así como:

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

Usando delete_all adecuadamente sería más rápido si no es necesario para buscar su primera MyContainer (o usarlo para otras cosas)

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

EDIT: para raíles 3

MyObject.where(my_container_id: 10).delete_all 
0

Uno o ambos de estos debe trabajar:

MyContainer.find(10).my_objects.destroy_all 

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

Utilizando este último, la solución cargaría cada objeto en la memoria y sería lento. Probablemente quiera ir con la primera solución. – Kosmonaut

+0

Ambos con instancia de cada objeto en la memoria. –

0

Puede eliminar objetos directamente como los siguientes

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