Rails:如何覆盖:destroy方法?

我尝试了很多东西来覆盖:destroy方法的行为,但没有任何作用。 我首先使用acts_as_paranoia插件,但它不适用于has_many中的模型:通过关联。

我想覆盖:destroy方法只是为了做这样的事情:

def destroy _run_destroy_callbacks { delete } end def delete self.update_attribute(:status => 0) freeze end 

也就是说,我只想更新另一个字段(状态为0)而不是破坏记录本身。

你有没有尝试过?:

  class MyClass < ActiveRecord::Base def destroy update_attribute(:status, 0) end end 

编辑:根据评论,可能还有其他工作,它可能只是关联定义上的(:dependent =>'')指定 - 或者如果它是HABTM,它可能根本不起作用。 也许关于删除和通过关联销毁的信息会有帮助吗? 粘贴相关部分如下:

删除还是销毁?

has_many和has_and_belongs_to_many关联具有destroy,delete,destroy_all和delete_all方法。

对于has_and_belongs_to_many,delete和destroy是相同的:它们会导致连接表中的记录被删除。

对于has_many,destroy将始终调用正在删除的记录的destroy方法,以便运行回调。 但是,删除将根据:dependent选项指定的策略进行删除,或者如果没有给出依赖选项,则它将遵循默认策略。 默认策略是:nullify(将外键设置为nil),但has_many:through除外,其中默认策略为delete_all(删除连接记录,不运行其回调)。

我认为最好的方法是覆盖before_destroy:filter来操纵依赖项:

 def Model before_destroy: mark_as_deleted def mark_as_deleted self.update_attribute(:status => 0) end end 

这不会取消destroy

完整的回调文档在这里 。

正如米克德所说,如果我们想要“手动”破坏品种,这个代码是好的:

 @varietal = Varietal.find('1') @varietal.destroy def destroy update_attribute(:status, 0) end 

这非常有效。 但是,正如我所说,如果我们更新父记录,我没有找到在孩子身上调用的destroy / delete / delete_all方法…所以如果有人有想法……