2012-05-15 2 views
20

У меня есть модель задачи, связанная с моделью проекта, через has_many through и нужно манипулировать данными перед удалением/вставкой через ассоциацию.Как использовать обратные вызовы в has_many посредством ассоциации?

С "Automatic deletion of join models is direct, no destroy callbacks are triggered." Я не могу использовать обратные вызовы для этого.

В Задаче Мне нужно все project_ids для вычисления значения для Project после сохранения задачи. Как я могу отключить удаление или изменение delete, чтобы уничтожить has_many через ассоциацию? Что лучше всего подходит для этой проблемы?

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 

ответ

45

Похоже, я должен использовать associations callbacksbefore_add, after_add, before_remove или 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

Это то, что я сделал

в модели:

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

в моем Lib папка:

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