Rails:dependent =>毁灭,想要召唤另一个行动而不是破坏

时间:2012-02-17 10:37:33

标签: ruby-on-rails destroy

我有一个完美运行的has_many:through模型。

  has_many :varietals
  has_many :grapes, :through => :varietals, :dependent => :destroy

我想调用另一个动作而不是:destroy。事实上,我不想取消项目或销毁它,我想将记录状态字段从1更新为0而不是销毁记录。

如何调用自定义方法而不是销毁?我想我可以在模型中做到这一点......谢谢。

这个方法放在哪里?在主模型中还是在销毁记录的模型中?

修改

我很抱歉,但我认为我没有解释我的问题。我的问题不仅仅是在主模型被销毁之后的某些东西。我想在Varietal模型中自定义destroy动作,即使主记录没有被破坏。

类似的东西:

class Varietal < ActiveRecord::Base

    private
      def destroy
        self.update_attributes(:status => 0)
      end
end

实际上这个动作没有被调用......

4 个答案:

答案 0 :(得分:8)

您可以使用before_destroy将自定义逻辑放在那里。如,

before_destroy :reset_status

def reset_status
  ...
end

查看here了解详情。

答案 1 :(得分:3)

您只需要在before_destroy或after_destroy上添加回调并操纵您的关联。通过示例

after_destroy :do_on_grapes

def do_on_grapes
  grapes.map(&:to_do)
end

答案 2 :(得分:1)

has_many:依赖仅限于几个选项。根据{{​​3}}:

  

:dependent如果设置为:destroy将销毁所有关联的对象   与此对象一起调用它们的destroy方法。如果设置为   :delete_all删除所有关联的对象而不调用它们   破坏方法。如果设置为:取消所有关联对象的外部   键被设置为NULL而不调用它们的保存回调。如果设置为   :restrict此对象引发ActiveRecord :: DeleteRestrictionError   异常,如果它有任何关联对象,则无法删除。

     

如果使用:through选项,则表示连接模型上的关联   必须是belongs_to,并且删除的记录是连接   记录,而不是相关记录。

看起来你需要改变destroy方法来更新状态字段。

答案 3 :(得分:0)

我认为解决问题的好方法是提供自定义销毁方法。对这些问题有几个回答,但你应该记住ActiveRecord和Relationships如:

class Image < ActiveRecord::Base
  has_many :comments, dependent: :destroy

使用回调机制来触发销毁链接到你的关系。通常,您应该保留此机制并将其添加到自定义实现中。 E.g。

  def destroy
    self.update deleted_at: Time.now
    run_callbacks :destroy
  end

你也可以阅读这篇文章: Triggering dependent: :destroy with overridden destroy-method