You should remove child node if parent node is deleted in mongodb

May 4, 2015

Outline

You should remove child node if parent node is delete in mongodb. Here is simple example.

Models

Parent

class Parent
  include Mongoid::Document

  field :name,  type: String
  has_many :children
end

Child

class Child
  include Mongoid::Document

  field :name,  type: String
  belongs_to :parent
end

Example

Bad

$ rails c
$ parent = Parent.create(name: "parent1")
$ parent.children.create(name: "child1")
$ child = parent.children.first

# if you delete parent child1 still exist in db.
$ parent.destroy
$ Parent.where(id, parent.id).size # result is 0
$ Child.where(id, child.id).size   # result is 1

Solution

You have to add cleanup logic using “before_destroy” callback

Parent

class Parent
  include Mongoid::Document

  field :name,  type: String
  has_many :children

  before_destroy do
    children.destroy_all
  end
end

Example

Good

$ rails c
$ parent = Parent.create(name: "parent1")
$ parent.children.create(name: "child1")
$ child = parent.children.first

# if you delete parent child1 is delete too in db.
$ parent.destroy
$ Parent.where(id, parent.id).size # result is 0
$ Child.where(id, child.id).size   # result is 0