【问题标题】:before_destroy and dependent destroy not firingbefore_destroy 和依赖销毁不触发
【发布时间】:2012-03-26 03:28:21
【问题描述】:

我有以下模型关联:

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 =&gt; :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。

【问题讨论】:

  • 如何删除Slider 实例?
  • def destroy slider = Slider.find(params[:id]) slider.delete render(:status => :ok, :nothing => true ) end

标签: ruby-on-rails activerecord callback


【解决方案1】:

您刚刚观察到deletedestroy 之间的区别。在您的控制器中调用

slider.delete

它只会执行 SQL DELETE 但不会调用任何回调。这就是为什么在正常情况下您想改用destroy 的原因。它将获取对象(如果需要),调用包括递归销毁在内的回调,然后才从数据库中删除对象。

有关详细信息,请参阅 deletedestroy 的文档。

【讨论】:

  • 天哪,注意了。我一直认为一个是另一个的别名。谢谢。
【解决方案2】:

确保您正在调用Slider#destroy 以触发回调。 Slider#delete 将直接删除记录而不调用它们。

【讨论】:

    【解决方案3】:
    class Slider < ActiveRecord::Base
      has_one :featured_happening,  :dependent => :destroy  
    end
    
    class FeaturedHappening < ActiveRecord::Base
      belongs_to :featured_item
    end
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-26
      • 2013-01-22
      相关资源
      最近更新 更多