覆盖rails活动记录会破坏has_and_belongs_to_many关系的意外删除

Lee*_*Lee 0 inheritance activerecord ruby-on-rails super destroy

我有一个继承自ActiveRecord :: Base的Commentable类和一个继承自Commentables的Event类.

我已经覆盖了这两个类中的destroy方法,并且Event.distroy调用了super.然而,一些意外的事情发生了.具体而言,将删除事件的has_and_belongs_to_many关联.我认为这种情况正在发生,因为一些模块被包含在Commentables和Event类之间,但不确定是否有办法阻止它.

这是简化的代码:

class Commentable < ActiveRecord::Base
  has_many :comments

  def destroy
    comments.destroy_all
    self.deleted = true
    self.save!
  end

end

class Event < Commentable
  has_and_belongs_to_many :practitioners, :foreign_key => "commentable_id"

  def destroy
    #some Event specific code
    super
  end

end
Run Code Online (Sandbox Code Playgroud)

我不想从数据库中删除行,只需设置一个"已删除"标志.我也不想删除任何关联.但是,在Event.destroy和Commentable.destroy之间的某处,其他一些rails代码会破坏has_and_belongs_to_many表中的记录.

知道为什么会这样,以及如何阻止它?

Ahm*_*rif 5

你实际上不必在Commentable模型上覆盖destroy ,只需添加一个before_destroy返回false实际取消destroy调用的回调.例如:

class Commentable < ActiveRecord::Base
 # ... some code ...
  before_destroy { |record|
    comments.destroy_all
    self.deleted = true
    self.save!
    false
  }
 # ... some code ...
 end
Run Code Online (Sandbox Code Playgroud)

这同样适用于Event模型; 只需添加一个回调而不覆盖destroy方法本身.

有关可用回调的更多信息,请点击此处.