Ruby on rails Rails软删除子记录

Ruby on rails Rails软删除子记录,ruby-on-rails,Ruby On 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.hi

轨道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
类父级0
self.hidden=true
其他的
自毁
结束
结束
结束
有时我想在孩子身上设置隐藏标志,而不是删除它。我是通过
接受
的嵌套属性来实现的。我需要在服务器端设置这个决定,我不能让用户决定是销毁还是隐藏

但不销毁记录:无法销毁记录:ActiveRecord::RecordNotDistromed:


正确的方法是什么?

抛出错误是因为您进入了无限循环(您正在调用
destroy
方法中的
destroy
方法)。改用super。此外,还需要将隐藏列更改保存到数据库中。在这种情况下,应该可以安全地使用
update\u column
(不会触发验证和回调,也不会将其他列保存到数据库中)

class-Kid0
更新_列(:隐藏,真)
其他的
超级的
结束
结束
结束

要回答其他问题,您需要解释什么是“某些计数”:

从文档“由
ActiveRecord::Persistence#destroy!
引发,调用destroy将返回false。”(来源:)=>您可能调用了
.destroyupdate\u column
不是一个好主意,因为正如您所说,它会跳过验证和回调,这可能非常重要。依我看,在这种情况下应该使用常规的
更新_属性(隐藏:true)
case@MrYoshiji-
update\u attributes
的问题是,它还将保存所有其他未保存的属性(字面上称为save internal),这在“销毁”对象时可能不是故意的。我确实缺少rails中的一个方法,它可以更新运行所有回调的单个列,但是我同意
update\u attributes
在这里可能会稍微安全一些。
class Kid < ActiveRecord::Base
  belongs_to :parent

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