Ruby on rails Rails:如何覆盖:销毁方法?
我尝试了很多方法来覆盖:destroy方法的行为,但没有任何效果。我首先使用了acts_as_paranoia插件,但它不适用于has_many:through association中的模型 我想覆盖:destroy方法,这样做: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
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