Ruby on rails Rails:如何覆盖:销毁方法?

Ruby on rails Rails:如何覆盖:销毁方法?,ruby-on-rails,destroy,Ruby On Rails,Destroy,我尝试了很多方法来覆盖:destroy方法的行为,但没有任何效果。我首先使用了acts_as_paranoia插件,但它不适用于has_many:through association中的模型 我想覆盖:destroy方法,这样做: def destroy _run_destroy_callbacks { delete } end def delete self.update_attribute(:status => 0) freeze e

我尝试了很多方法来覆盖:destroy方法的行为,但没有任何效果。我首先使用了acts_as_paranoia插件,但它不适用于has_many:through association中的模型

我想覆盖: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
classmyclass
编辑:根据评论,可能还有其他东西在起作用,它可能只是关联定义上的(:dependent=>'')名称——或者如果它是HABTM,它可能根本不起作用。也许会有帮助?粘贴以下相关部分:

删除还是销毁

有很多,有很多,很多协会都有方法 销毁、删除、全部销毁和全部删除

因为has_和_属于_many,delete和destroy是一样的:它们 导致删除联接表中的记录

因为有很多,destroy总是调用 删除记录以便运行回调。然而,删除将 或者根据 :dependent选项,或者如果未提供:dependent选项,则它将 遵循默认策略。默认策略是:取消(设置 外键为nil),除了has_many:through,其中默认值为 策略是删除所有(删除加入记录,而不运行其 回调)


正如Miked所说,如果我们想“手动”销毁该品种,该代码是好代码:


这很好用。但是,正如我所说,如果我们更新父记录,我没有找到对子记录调用的destroy/delete/delete_all方法。。。因此,如果有人有想法…

我认为最好的方法是在销毁之前覆盖
过滤器以操作依赖项:

def Model
    before_destroy: mark_as_deleted

    def mark_as_deleted  
        self.update_attribute(:status => 0)
    end
end
但是,这不会取消销毁


是的,这是我第一次尝试。这没用。我可以在日志中看到删除请求。自定义销毁方法似乎没有被调用。Hrm,我实际上在几个应用程序的几个模型中使用了这个方法,并且它工作正常。这个特殊型号有什么“特殊”的吗?你叫删除还是销毁?你会想要后者。该记录在AREL(ActiveRecord关系)中从其父记录销毁,可能是问题所在?事实上,我更新了我的葡萄酒模型和记录(主窗体,控制器中的更新方法),如果我选择删除子项(包含自定义销毁的品种模型),显然不会调用它。也许,rails机制与销毁子对象的父对象不同(在子对象模型上不调用destroy?)很难说,实际上,我添加了AR文档中的一个片段,可能会发现一些东西。感谢您的帮助和建议。葡萄酒模式和品种模式之间的关系是“有很多贯穿”。我读了你的自旋网,我试着用“销毁,删除,删除所有”。。。但都是一样的。我希望您理解,我的问题是当我更新主模型(wine)时,而不是如果我想销毁它(和销毁child)。例如,我创建了一个葡萄酒(并添加了一个品种),然后我想更新葡萄酒(并选择销毁添加的品种)=>这是我的问题,我显示了从品种中删除(而不是更新到状态=0)和更新葡萄酒(确定)…这仍然在控制器中调用destroy(),它只是首先通过def运行。返回false不起作用,至少我看不出来。这个答案不正确。如果在销毁之前调用
,即使在更新之后记录也会被删除。
def Model
    before_destroy: mark_as_deleted

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