2012-05-15 7 views
20

Tengo un modelo de tarea asociado a un modelo de proyecto mediante has_many through y necesito manipular los datos antes de eliminarlos/insertarlos a través de la asociación.¿Cómo usar las devoluciones de llamada en una asociación has_many through?

Dado que "Automatic deletion of join models is direct, no destroy callbacks are triggered." no puedo usar devoluciones de llamada para esto.

En Tarea, necesito todos los project_ids para calcular un valor para Project después de guardar la Tarea. ¿Cómo puedo desactivar eliminar o cambiar eliminar para destruir en has_many a través de la asociación? ¿Cuál es la mejor práctica para este problema?

class Task 
    has_many :project_tasks 
    has_many :projects, :through => :project_tasks 

class ProjectTask 
    belongs_to :project 
    belongs_to :task 

class Project 
    has_many :project_tasks 
    has_many :tasks, :through => :project_tasks 

Respuesta

45

Parece que tengo que utilizar associations callbacksbefore_add, after_add, before_remove o after_remove

class Task 
    has_many :project_tasks 
    has_many :projects, :through => :project_tasks, 
         :before_remove => :my_before_remove, 
         :after_remove => :my_after_remove 
    protected 

    def my_before_remove(obj) 
    ... 
    end 

    def my_after_remove(obj) 
    ... 
    end 
end 
1

Esto es lo que hice

en el modelo:

class Body < ActiveRecord::Base 
    has_many :hands, dependent: destroy 
    has_many :fingers, through: :hands, after_remove: :touch_self 
end 

en mi Carpeta Lib:

module ActiveRecord 
    class Base 
    private 
    def touch_self(obj) 
     obj.touch && self.touch 
    end 
    end 
end 
Cuestiones relacionadas