Rails, Deleting Children without Deleting Parent using :has_many

Dex picture Dex · Apr 20, 2010 · Viewed 12.3k times · Source

I have

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

I want to delete all the MyObjects in the container without having to delete the MyContainer. My model does have :dependent => :destroy, however I don't want to have to delete and re-create the object because it is slower.

Something like this does not work:

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

How can I accomplish this?

Answer

maček picture maček · Apr 20, 2010

delete_all is an ActiveRecord::Base class method.

You should use destroy_all. Something like:

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

Using delete_all properly would be faster if you don't need to lookup your MyContainer first (or use it for other stuff)

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

EDIT: for rails 3

MyObject.where(my_container_id: 10).delete_all