【问题标题】:How to validate parent-child relationships in Rails?如何在 Rails 中验证父子关系?
【发布时间】:2013-05-19 13:50:07
【问题描述】:

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

我可以使用

验证行是唯一的

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

如何改进?

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      你的设计看起来有点复杂,看看你能不能让它更简单。可能单表继承在这里有意义,包括更好的验证处理。我可能是错的,因为我对要求不太了解。

      【讨论】:

      • 使用has_many 调用似乎同样昂贵。我不明白单表继承将如何工作。有一个Category 模型。
      • has_many 可能更容易理解,因为它更具可读性。关于 STI,我在想是否有 3 种不同的模型有意义,即 1. 没有任何父母或孩子的类别 2. 有父母的类别 3. 有父母和孩子的类别
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 2011-09-05
      • 2013-01-10
      • 1970-01-01
      • 2018-01-28
      • 2010-11-15
      • 1970-01-01
      相关资源
      最近更新 更多