2012-03-26 71 views
11

我有以下的模型关联:before_destroy和依赖销毁不点火

class Slider < ActiveRecord::Base 
    has_one :featured_happening, :as => :featured_item, :dependent => :destroy 
    before_destroy :destroy_featured_happening 
    after_create :create_featured_happening 
end 

class FeaturedHappening < ActiveRecord::Base 
    belongs_to :featured_item, :polymorphic => true 
end 

当我破坏Slider对象我以为dependent => :destroy会自动销毁的featured_item但事实并非如此。

滑动控制器

def destroy  
    slider = Slider.find(params[:id]) 
    slider.delete 
    render(:status => :ok, :nothing => true) 
    end 

于是我尝试了回调与before_destroy手动删除featured_item当滑块对象被销毁,并没有获取调用。

如何删除滑块对象时删除featured_item?使用Rails 3.2。

+0

你如何删除'Slider'实例? – 2012-03-26 03:35:18

+0

def destroy slider = Slider.find(params [:id]) slider.delete render(:status =>:ok,:nothing => true) end – chell 2012-03-26 04:00:53

回答

19

您刚刚观察到deletedestroy之间的差异。在你的控制器,你叫

slider.delete 

将只执行一个SQL DELETE,但不会调用任何回调。这就是为什么在正常情况下你想用destroy代替。它将获取对象(如果有必要),调用包括递归销毁在内的回调,然后仅从数据库中删除该对象。

有关更多信息,请参阅deletedestroy的文档。

+0

Geez,值得注意。我一直认为一个是另一个的别名。谢谢。 – 2015-03-01 20:12:10

4

确保您致电​​以触发回调。 Slider#delete只会删除记录而不会调用它们。

0
class Slider < ActiveRecord::Base 
    has_one :featured_happening, :dependent => :destroy 
end 

class FeaturedHappening < ActiveRecord::Base 
    belongs_to :featured_item 
end 

如果你的代码很简单,就像上面的简单关系一样。然后随着滑块的删除,Feature Happing将随着滑块的删除而被删除。但在你的情况下,这种关系是多态的。在DB中的功能happing表中,abject_id将是滑块的ID或可能是其他类。因此,依赖:销毁不工作。因此,您应该需要使用before_destroy回调来删除它,其中您首先检索记录,然后销毁它们