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

时间:2015-01-23 18:26:18

标签: ruby-on-rails database parse-platform

在我的parse.com数据中说我有一个Family类,并且这些系列有一系列子类,它们是Child类的成员。还要说孩子有一个指向其家庭的后退指针,并且家庭会缓存一些关于它的孩子的数据,比如最大的孩子的名字。

我希望使用beforeSave和beforeDelete尽可能保持完整性。因此,例如,在删除孩子之前,我想将该孩子从其家庭中移除,我可能需要更新该家庭的长子。没关系,但在删除家庭之前,我还想删除该家庭的孩子。

我担心的是:如果在删除一个家庭时,我删除了所有的孩子,如果在删除每个孩子时,我需要操纵该孩子的家庭,反复保存,我会失败,因为我和#39;我试图在删除时更新?

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

我在parse.com中遇到此问题,但我可以看到在rails项目中可能会出现同样的问题

1 个答案:

答案 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