在 beforeSave 或 beforeDelete 中处理循环引用的标准方法

Standard way to handle circular references in beforeSave or beforeDelete

在我的 parse.com 数据中说我有一个家庭 class 并且这些家庭有一个 children 数组,他们是 Child class.还要说 Child 有一个指向其家族的后向指针,并且家族缓存了一些关于它的 children 的数据,比如最年长的名字 child.

我想使用 beforeSave 和 beforeDelete 尽可能多地保持完整性。因此,例如,在删除 child 之前,我想从其家族中删除 child,并且我可能需要更新家族中最年长的 child。没关系,但我也想,在删除一个家庭之前,删除那个家庭的 children.

我的顾虑是:如果在删除一个家庭时,我删除了所有children,如果在删除每个child时,我需要操作那个child的家人,反复保存,会不会因为边删边更新而失败?

是否有一些标准规则可以申请我在 beforeSave/beforeDelete 钩子中可以做什么和不能做什么?

我在 parse.com、 中遇到了这个问题,但我可以看到在 rails 项目 .

中可能会出现同样的问题

这是一个涉及单一职责原则的问题。如果你删除了一个 child 并且你想在那之后更新这个家庭的老大, child object 不应该知道你正在更新所以你可能想要做的是使用一个删除 child.

时的服务 class

另一方面,删除家庭时,只需将 dependent 选项设置为 :destroy

如您所见,删除 child 后,您始终可以在服务 class 中 执行任何操作 ,而不必担心任何回调会影响其他模型,因为理想情况下,child 模型不应在 created/updated/deleted 时更新其他模型。

示例服务 class 看起来像

class ChildDeleter
  def initialize(child)
    @child = child
  end

  def process_destroy
    child.destroy
    update_eldest
  end

  private

  attr_reader :child

  def update_eldest
    # add code here to update the eldest member of the family
  end
end

# in your controller
def destroy
  child = Child.find(params[:id])
  ChildDeleter.new(child).process_destroy
end