2011-05-18 10 views
18

¿Cuál será la mejor/manera SECA de destruir todos los dependientes de un objeto basado en una condición. ?Rails - AciveRecord use: dependent =>: destroy on condition

Ex:

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

condición será en Destruir:

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

¿Hay una manera de utilizar Proc en el: condición dependiente. He descubierto los métodos para destruir los dependientes de forma individual, pero esto no es seco y flexible para otras asociaciones,

Nota: He formado por el ejemplo .. no es una lógica real

Respuesta

34

No. Usted debe quitar :dependent => :destroy y agregue after_destroy devolución de llamada donde puede escribir cualquier lógica que desee.

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 
+0

Sólo tenga cuidado con las devoluciones de llamada como aquellas obras bien a menos que esté procesando donde se encuentra ahora enormes de datos donde las devoluciones de llamada haría un gran problema de rendimiento de tú. Una solución podría ser 'eliminación masiva' que no es compatible con rieles para asociaciones, por lo que necesitaría escribir algún código – ted

0

Esta otra manera le permite mantener sus dependent cláusulas:

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

    def destroy 
    ActiveRecord::Base.transaction do 
     if self.is_fired? 
     self.jobs.destroy_all 
     self.coworkers.destroy_all 
     self.company_credit_cards.destroy_all 
     end 
     super 
    end 
    end 
end 
Cuestiones relacionadas