Ruby on rails Rails软删除子记录
轨道4.2 我有一个父类,它接受子类的嵌套属性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
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。”(来源:)=>您可能调用了.destroy这个方法返回false,这会引发错误我认为在这里使用update\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