Search code examples
ruby-on-railsrubyactiverecorddestroy

Rails - AciveRecord use :dependent => :destroy on condition


What will be the best/DRY way to destroy all the dependents of an object based on a condition. ?

Ex:

class Worker < ActiveRecord::Base
 has_many :jobs , :dependent => :destroy
 has_many :coworkers , :dependent => :destroy
 has_many :company_credit_cards, :dependent => :destroy
end 

condition will be on Destroy:

if self.is_fired? 
 #Destroy dependants records
else
 # Do not Destroy records
end 

Is There a Way to use Proc in the :dependent condition. I have found the methods to destroy the dependents individually, but this is not DRY and flexible for further associations,

Note: I have made up the example.. not an actual logic


Solution

  • No. You should remove :dependent => :destroy and add after_destroy callback where you can write any logic you want.

    class Worker < ActiveRecord::Base
      has_many :jobs
      has_many :coworkers
      has_many :company_credit_cards
      after_destroy :cleanup
    
      private
      def cleanup
        if self.is_fired?
          self.jobs.destroy_all
          self.coworkers.destroy_all
          self.company_credit_cards.destroy_all
        end
      end
    end