Rails软删除子记录

时间:2015-08-13 14:32:42

标签: ruby-on-rails

Rails 4.2

我有一个父类,它接受其子节点的嵌套属性。

class Parent < ActiveRecord::Base
  has_many :kids
  accepts_nested_attributes_for :kids, allow_destroy: true
end

class Kid < ActiveRecord::Base
  belongs_to :parent

  def destroy
    if some_count > 0
      self.hidden = true
    else
      self.destroy
    end
  end
end

我有时想在孩子身上设置隐藏标志,而不是删除它。我是通过accepts_nested_attributes_for这样做的。我需要在服务器端设置此决定,我不能让用户决定是销毁还是隐藏。

但不要摧毁加注ActiveRecord::RecordNotDestroyed - Failed to destroy the record:

这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

抛出错误是因为你进入了无限循环(你在destroy方法中调用了destroy方法)。请改用super。您还需要将隐藏的列更改保存到数据库。在这种情况下,使用update_column应该是安全的(没有验证,也没有触发回调,没有其他列保存到数据库中)

class Kid < ActiveRecord::Base
  belongs_to :parent

  def destroy
    if some_count > 0
      update_column(:hidden, true)
    else
      super
    end
  end
end

要回答其他问题,您需要解释some_count是什么。 :)