在我的parse.com数据中说我有一个Family类,并且这些系列有一系列子类,它们是Child类的成员。还要说孩子有一个指向其家庭的后退指针,并且家庭会缓存一些关于它的孩子的数据,比如最大的孩子的名字。
我希望使用beforeSave和beforeDelete尽可能保持完整性。因此,例如,在删除孩子之前,我想将该孩子从其家庭中移除,我可能需要更新该家庭的长子。没关系,但在删除家庭之前,我还想删除该家庭的孩子。
我担心的是:如果在删除一个家庭时,我删除了所有的孩子,如果在删除每个孩子时,我需要操纵该孩子的家庭,反复保存,我会失败,因为我和#39;我试图在删除时更新?
是否有一些标准规则可以申请我在beforeSave / beforeDelete挂钩中能做什么和不能做什么?
我在parse.com中遇到此问题,但我可以看到在rails项目中可能会出现同样的问题。
答案 0 :(得分:0)
这是一个涉及单一责任原则的问题。如果您删除了一个孩子,并且您希望在此之后更新该家庭的长者,则该子对象不应该知道您正在更新,因此您可能想要做的是在删除孩子时使用服务类。
另一方面,当您删除某个系列时,只需将dependent
选项设置为:destroy
。
正如您所看到的,您可以在删除子项后始终在服务类中执行任何操作,而不必担心会影响其他模型的任何回调,因为理想情况下,子模型不应该是在创建/更新/删除模型时更新其他模型。
示例服务类看起来像
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