在 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
在我的 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