2

我有一个Category可以有多个父子类别的模型。我使用Hierarchy包含parent_categorychild_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

如何改进?

4

2 回答 2

1

您指的是一种“循环”关系 - 恕我直言,rails 中没有为此内置默认验证器。

于 2013-05-20T00:55:52.080 回答
0

为了使其更简单,您可以执行以下操作:

  • 添加一个具有 has_many 关系的集合,例如 parents,它返回其父级以及其父级的父级
  • 检查 children_id 是否包含在上面的 parents 集合中

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

于 2013-05-20T18:08:06.380 回答