Module: RecurseDelete

Extended by:
ActiveSupport::Concern
Included in:
ActiveRecord::Base
Defined in:
lib/recurse-delete.rb

Defined Under Namespace

Modules: ClassMethods

Instance Method Summary collapse

Instance Method Details

#delete_recursively(parent_class, parent_ids) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/recurse-delete.rb', line 33

def delete_recursively(parent_class, parent_ids)
  # delete all the parent records
  parent_class.delete_all(:id => parent_ids)

  # get the assocs for the parent class
  assocs = parent_class.reflect_on_all_associations.select do |assoc|
    [:destroy, :destroy_all, :delete, :delete_all].include? assoc.options[:dependent]
  end
  assocs.each do |assoc|
    # get the dependent class
    dependent_class = assoc.name.to_s.classify.constantize
    # get the foreign key
    foreign_key = (assoc.options[:foreign_key] or parent_class.to_s.foreign_key)
    # get all the dependent record ids 
    dependent_ids = dependent_class.where(foreign_key => parent_ids).value_of(:id)
    # recurse
    delete_recursively(dependent_class, dependent_ids)
  end
end

#recurse_deleteObject



29
30
31
# File 'lib/recurse-delete.rb', line 29

def recurse_delete
  delete_recursively self.class, self.id
end