如何在Rails中验证父子关系?

时间:2013-05-19 13:50:07

标签: ruby-on-rails activerecord

我有一个Category模型,可以有多个父类别和子类别。我使用包含Hierarchyparent_category属性的child_category模型对此进行了建模。

我可以使用

验证行是唯一的

validates_uniqueness_of :parent_category_id, scope: :child_category_id

这(以及数据库中相应的唯一索引)注意没有多行表示相同的父子关系。

但是,我想阻止某人将孩子的父母分配为孩子。对于前者如果类别A是类别B的父类,则将类别A指定为类别B的子类应导致验证错误。

我能想到的唯一方法是使用validate方法查询数据库。

def child_parent_messup
  unless Hierarchy.where(child_category_id: parent_category_id, parent_category_id: child_category_id).blank?
      errors[:base] << "This child is also a parent of the same class." 
  end
end

如何改进?

2 个答案:

答案 0 :(得分:1)

你所指的是一种'循环'关系 - 而且,恕我直言,为此没有为轨道内置的默认验证器。

答案 1 :(得分:0)

为简化起见,您可以执行以下操作:

  • 添加一个has_many关系的集合,例如,parent,返回其父级及其父级的父级
  • 检查children_id是否包含在上述父集合中

您的设计似乎有点复杂,看看您是否可以使其更简单。可能是SIngle Table Inheritance在这里有意义,包括更好的验证处理。我可能错了,因为我对这个要求不太了解。