我有一个完美运行的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
实际上这个动作没有被调用......
答案 0 :(得分:8)
答案 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