Damp
Damp

Reputation: 3348

:dependent => :delete_all not working

I've got 2 models with a 1 to many association that I try to get a rails cascading delete working on.

I'm fairly new to rails and I've tried everything I could but I still can't get it to work...

Here are my 2 models

class CmsHomeSlide < ActiveRecord::Base
    attr_accessible :slide_order, :start_datetime, :end_datetime, :slide_type, :header, :headline, :cta_text, :cta_link, :active
    has_many :cms_home_slide_detail, :dependent => :delete_all
    validates_presence_of :slide_type, :slide_order
end

class CmsHomeSlideDetail < ActiveRecord::Base
    attr_accessible :start_datetime, :end_datetime, :position, :image_url, :link, :cms_home_slide, :active
    belongs_to :cms_home_slide
end

And the test script I'm using (as a runner, but dev environment and test environment fail the same way)

CmsHomeSlide.delete_all
CmsHomeSlideDetail.delete_all

slide = Factory(:home_slide)
det1 = Factory(:home_slide_detail, :cms_home_slide => slide, :position => 1)
det2 = Factory(:home_slide_detail, :cms_home_slide => slide, :position => 2)

puts "Slides length #{CmsHomeSlide.all.length}"
puts "Details length #{CmsHomeSlideDetail.all.length}"

slide.delete

puts "Slides length #{CmsHomeSlide.all.length}"
puts "Details length #{CmsHomeSlideDetail.all.length}"

Output is

Slides length 1
Details length 2
Slides length 0
Details length 2

What am I missing?

Upvotes: 0

Views: 1726

Answers (1)

Mitch Dempsey
Mitch Dempsey

Reputation: 39869

You need to use :dependent => :delete or :dependent => :destroy

From the guide:

If you set the :dependent option to :destroy, then deleting this object will call the destroy method on the associated object to delete that object. If you set the :dependent option to :delete, then deleting this object will delete the associated object without calling its destroy method.

http://guides.rubyonrails.org/association_basics.html

Upvotes: 2

Related Questions