motion/model/model.rb
def destroy(options = {})
      call_hooks 'destroy' do
        options = options.dup
        options[:omit_model_identifiers] ||= {}
        options[:omit_model_identifiers][model_identifier] = self
        self.class.association_columns.each do |name, col|
          delete_candidates = get_attr(name)
          Array(delete_candidates).each do |candidate|
            next if options[:omit_model_identifiers][candidate.model_identifier]
            if col.dependent == :destroy
              candidate.destroy(options)
            elsif col.dependent == :delete
              candidate.delete(options)
            end
          end
        end
        delete
      end
      self
    end
def destroy(options = {})
      call_hooks 'destroy' do
        options = options.dup
        options[:omit_model_identifiers] ||= {}
        options[:omit_model_identifiers][model_identifier] = self
        self.class.association_columns.each do |name, col|
          delete_candidates = get_attr(name)
          Array(delete_candidates).each do |candidate|
            next if options[:omit_model_identifiers][candidate.model_identifier]
            if col.dependent == :destroy
              candidate.destroy(options)
            elsif col.dependent == :delete
              candidate.delete(options)
            end
          end
        end
        delete
      end
      self
    end
Destroys the current object. The difference between delete
 and destroy is that destroy calls <tt>before_delete</tt>
 and <tt>after_delete</tt> hooks. As well, it will cascade
 into related objects, deleting them if they are related
 using <tt>:dependent => :destroy</tt> in the <tt>has_many</tt>
 and <tt>has_one></tt> declarations

 Note: lifecycle hooks are only called when individual objects
 are deleted.