Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在beforeSave或beforeDelete中处理循环引用的标准方法_Ruby On Rails_Database_Parse Platform - Fatal编程技术网

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

Ruby on rails 在beforeSave或beforeDelete中处理循环引用的标准方法,ruby-on-rails,database,parse-platform,Ruby On Rails,Database,Parse Platform,假设在我的parse.com数据中,我有一个Family类,这些家族有一个作为Child类成员的子类数组。还可以说孩子有一个指向其家庭的后向指针,并且家庭缓存了一些关于其孩子的数据,如长子的名字 我希望使用beforeSave和beforeDelete尽可能多地维护完整性。例如,在删除一个孩子之前,我想将该孩子从其家庭中删除,我可能需要更新该家庭的长子。那很好,但我还想,在删除一个家庭之前,删除该家庭的孩子 这就是我关心的问题:如果在删除一个族时,我删除了所有的子项,如果在删除每个子项时,我需要

假设在我的parse.com数据中,我有一个Family类,这些家族有一个作为Child类成员的子类数组。还可以说孩子有一个指向其家庭的后向指针,并且家庭缓存了一些关于其孩子的数据,如长子的名字

我希望使用beforeSave和beforeDelete尽可能多地维护完整性。例如,在删除一个孩子之前,我想将该孩子从其家庭中删除,我可能需要更新该家庭的长子。那很好,但我还想,在删除一个家庭之前,删除该家庭的孩子

这就是我关心的问题:如果在删除一个族时,我删除了所有的子项,如果在删除每个子项时,我需要操纵该子项的族,并重复保存它,我是否会因为在删除时尝试更新而失败

在beforeSave/beforeDelete钩子中,是否有一些标准规则可以应用于我能做和不能做的事情


我在parse.com中遇到了这个问题,但是我可以看到同样的问题如何在rails项目中发生

这是一个涉及单一责任原则的问题。如果您删除了一个子对象,并且希望在此之后更新该家族的长子对象,那么子对象不应该知道您正在更新,因此您可能希望在删除子对象时使用服务类

另一方面,当删除族时,只需将
相关
选项设置为
: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

谢谢这是有道理的。也许我可以这样概括:使用delete/save钩子来更改指向的对象,使用applogic来更改指向您的对象。