Как использовать обратные вызовы в 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
Ответы
Ответ 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