我遇到了Rails验证问题,我将在此处解释。
想象一下我有这种情况:
父母有很多ParentChild, 孩子有很多ParentChild, ParentChild同时属于Parent和Child, 此外,父母可以是活跃的或不活跃的。
我需要在活跃的父母身上验证Child的存在。为此,我写了这段代码:
validates :child, presence: { message: "can't be blank on active parents" }, if: -> (parent) { parent.active? }
它有点工作。
假设我有这个父母与4个孩子相关联,我从中移除了这4个相关的孩子。然后验证将启动并将错误消息添加到父模型,但它不会阻止删除关联的子项。
基本上,关联的孩子正在被移除并且验证发生。
我还尝试过自定义验证甚至是before_validation回调来手动检查子项的删除,但似乎没有任何效果。
我们非常感谢您的帮助。
答案 0 :(得分:0)
如何在before_destroy
模型
ParentChild
回调
...
before_destroy :check_if_last
...
private
def check_if_last
if parent.active? && parent.children.count == 1
errors.add(:child, "can't be blank on active parents")
end
end
答案 1 :(得分:0)
由于你只想破坏关系,你可以挂钩关系模型本身。请注意返回错误。为了通过回调回滚事务,你需要返回false,yes是false而不是falsy值,否则它仍然会提交。
before_destroy :last_of_active_parent?
private
def last_of_active_parent?
if parent.active? && parent.children.count == 1
errors.add(:parent, "which is active can't lose the last child")
false
end
end