通过assosiation对has_many进行ActiveRecord状态验证

时间:2015-07-30 14:22:01

标签: ruby-on-rails ruby ruby-on-rails-4 rails-activerecord

我遇到了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回调来手动检查子项的删除,但似乎没有任何效果。

我们非常感谢您的帮助。

2 个答案:

答案 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