2012-02-17 57 views
2

我有一个has_many:through模型,完美地工作。Rails:dependent =>摧毁,想调用另一个动作而不是销毁

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 

其实这个动作是不是叫......

回答

1

的has_many:依赖仅限于几个选项。按照documentation

:依赖如果设置为:摧毁所有相关联的对象通过调用其销毁方法销毁 沿着这个对象。如果设置为 :delete_all将删除所有关联的对象,而不调用它们的销毁方法 。如果设置为:取消所有关联对象的外键 键设置为NULL而不调用其保存回调。如果设置为 :限制此对象会引发ActiveRecord :: DeleteRestrictionError 异常,如果它具有任何关联的对象,则不能将其删除。

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

它看起来像你需要改变销毁方法来更新状态字段。

+0

我更新了我的第一条消息,并解释更多...如何更改破坏方法? – 2012-02-17 12:43:03

+0

没关系,如果你看到我以前的评论(删除)... Phyo和Shingara有权利。 – ScottJShea 2012-02-17 17:28:34

+0

我很抱歉,但问题不在于我的模型中的关联。如果我只有一个模型,我不能覆盖destroy方法来改变它的行为。这什么都不做。添加之前或之后的回调不会改变摧毁:该项目将被销毁。 – 2012-02-17 21:52:07

2

你只需要在before_destroy或after_destroy上添加一个回调并操纵你的关联。举例

after_destroy :do_on_grapes 

def do_on_grapes 
    grapes.map(&:to_do) 
end 
7

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

before_destroy :reset_status 

def reset_status 
    ... 
end 

查看here了解更多详情。

0

我认为解决您的问题的好方法是提供自定义销毁方法。有像这些问题提出了一些回应,但是你应该记住的ActiveRecord和关系,如:

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

触发破坏链接到你的关系,也使用回拨机制。通常你应该保留这个机制并将它添加到你的自定义实现中。例如。

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

你可以看到这篇文章,太: Triggering dependent: :destroy with overridden destroy-method