Rails:如何覆盖:destroy方法?

时间:2012-02-17 18:03:06

标签: ruby-on-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)而不是破坏记录本身。

3 个答案:

答案 0 :(得分:5)

你试过吗?:

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

编辑:基于评论,可能还有其他工作正常,它可能只是关联定义上的(:dependent =&gt;'')指定 - 或者如果它是HABTM,它可能根本不起作用。也许this info on delete and destroy through associations会有所帮助吗?粘贴以下相关部分:

  

删除或销毁?

     

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

     

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

     

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

答案 1 :(得分:2)

我认为最好的方法是覆盖before_destroy:过滤器来操纵家属:

def Model
    before_destroy: mark_as_deleted

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

这不会取消destroy

The full callback documentation is here

答案 2 :(得分:0)

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

@varietal = Varietal.find('1')    
@varietal.destroy 

def destroy
  update_attribute(:status, 0)
end

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