Подтвердить что ты не робот

Как использовать обратные вызовы в has_many через объединение?

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

Так как "Автоматическое удаление моделей объединений является прямым, не запускаются обратные вызовы destroy." Я не могу использовать обратные вызовы для этого.

В Задаче мне нужно, чтобы все project_ids вычисляли значение для Project после сохранения задачи. Как я могу отключить удаление или изменить удаление, чтобы уничтожить 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
4b9b3361

Ответ 1

Похоже, мне нужно использовать обратные вызовы ассоциаций before_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   

Ответ 2

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

в модели:

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