 <p>The solution was to use destroy and create a callback to automatically do a deep cascading.</p> <pre><code>class Place &lt; ActiveRecord::Base before_destroy :delete_children_objects has_many :place_uploads, :dependent =&gt; :destroy protected def delete_children_objects @places = PlaceUpload.where(place_id: id) @places.each do |place| TagsCustomer.where(place_upload_id: place.id).destroy_all Match.where(place_upload_id: place.id).destroy_all end end end </code></pre>