Ruby activerecord : Difference between delete_all and destroy_all

17 Apr 2012


        Delete method, deletes the records matching conditions without instantiating the records , using a SQL DELETE statement, and returns the number of rows deleted. They won't call destroy method nor invoking callbacks. They are much efficient than destroy_all. They won't honor the rules defined on relations with :dependent.

  • No instantiation of records
  • Callbacks are not invoked
  • Efficient
  • Using a single direct SQL DELETE statement
  • :dependent rules defined on associations are not executed.
  • Returns number of rows deleted.


      The destroy method, destroys the records matching conditions by instantiating each record. It returns a collection of objects which they are destroyed, but the returned objects will be frozen so that no changes could be made on it. They execute callbacks and :dependent rules. They are inefficient compared to delete_all since they may use more than 1 SQL statement to destroy a record, which depends on callback. 

  • Instantiate each record
  • Callbacks are invoked
  • Inefficient
  • More than 1 query used, depends on callbacks
  • :dependent rules defined on associations are executed.
  • Returns collection of objects
If you particularly enjoy my work, I appreciate donations given with Gittip.