module SoftDeleteRails::Model::InstanceMethods

Public Instance Methods

destroy(force=nil) click to toggle source
Calls superclass method
# File lib/soft_delete_rails/has_soft_delete.rb, line 22
def destroy(force=nil)
  if force == :force
    if super()
      hard_destroy_dependent_records
      return !self.persisted?
    end
  else
    run_callbacks(:destroy) do
      soft_deleted? || new_record? ? save : update_deleted_at(Time.current)
    end
  end
end
revive() click to toggle source
# File lib/soft_delete_rails/has_soft_delete.rb, line 35
def revive
  if soft_deleted?
    update_deleted_at(nil)
    revive_dependent_records
    return self.reload # return self reloaded
  end
end
soft_deleted?() click to toggle source
# File lib/soft_delete_rails/has_soft_delete.rb, line 43
def soft_deleted?
  deleted_at.present?
end

Private Instance Methods

hard_destroy_dependent_records() click to toggle source

Perform a hard destroy on the dependent records

# File lib/soft_delete_rails/has_soft_delete.rb, line 71
def hard_destroy_dependent_records
  reflections.each do |key, relation|
    if relation.options[:dependent] == :destroy
      records = send(key).try(:unscope, where: :deleted_at) if key.to_s.singularize.camelize.constantize.column_names.include?('deleted_at')
      records = Array.wrap(send(key)) if records.blank?
      records.each do |record|
        if record.respond_to?(:soft_deleted?)
          record.destroy(:force)
        else
          record.destroy
        end
      end
    end
  end
end
reflections() click to toggle source
# File lib/soft_delete_rails/has_soft_delete.rb, line 87
def reflections
  self.class.reflections
end
revive_dependent_records() click to toggle source
# File lib/soft_delete_rails/has_soft_delete.rb, line 58
def revive_dependent_records
  reflections.each do |key, relation|
    if relation.options[:dependent] == :destroy
      records = Array.wrap(send(key).try(:deleted)) if key.to_s.singularize.camelize.constantize.column_names.include?('deleted_at')
      records = Array.wrap(send(key)) if records.blank?
      records.to_a.each do |record|
        record.revive if record.respond_to?(:revive)
      end
    end
  end
end
update_deleted_at(value) click to toggle source
# File lib/soft_delete_rails/has_soft_delete.rb, line 49
def update_deleted_at(value)
  self.deleted_at = value
  if self.class.delete_options[:validate] == false
    save(validate: false)
  else
    save!
  end
end