8

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?

maček
  • 76,434
  • 37
  • 167
  • 198
Dex
  • 12,527
  • 15
  • 69
  • 90

3 Answers3

27

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
maček
  • 76,434
  • 37
  • 167
  • 198
0

One or both of these should work:

MyContainer.find(10).my_objects.destroy_all

MyContainer.find(10).my_objects.each(&:destroy)
Robert Speicher
  • 15,382
  • 6
  • 40
  • 45
0

You can delete objects directly like following

MyObject.delete_all(["my_container_id=?", 10])
Salil
  • 46,566
  • 21
  • 122
  • 156