Remove method for Mongoid::Paranoia
module Mongoid
module Paranoia
extend ActiveSupport::Concern
module ClassMethods
end
module InstanceMethods
# 'remove' method is soft-delete for Paranoia module which i read somewhere is extracted from
# 'acts_as_paranoia' gem. In any which way, i was still unable to use the callback before_destroy, hence this hack.
def remove
super
has_deleted_the_record = false
if self.remove_associated_records
return has_deleted_the_record = true
end
has_deleted_the_record
end
# What would this do ?
# Basically, this would fetch all the associated models with embeds_many and references_many, we do not want parent model.
# We only want the child model to delete( or in this case 'remove') the records.
# basic algo :
# 1. Get the first element i.e. model_info from the array of the associated models.
# 2. Check if its nil
# 3. If not, downcase and pluralize and call that method.
# for ex: Client.first.projects
# 4. remove them
# NOTE: remove is now recursive
def remove_associated_records
associated_model = self.class.reflect_on_all_associations(:embeds_many).first || self.class.reflect_on_all_associations(:references_many).first
deleted = false
if !associated_model.nil?
self.send( associated_model.class_name.downcase.pluralize ).each do |record|
record.remove
deleted = true
end
else
return deleted = true
end
return deleted
end
end
end
end
Written by Kaushik Thirthappa
Related protips
Have a fresh tip? Share with Coderwall community!
Post
Post a tip
Sponsored by #native_company# — Learn More
#native_title#
#native_desc#