27

has_many を介して Project モデルに関連付けられた Task モデルがあり、関連付けを介して削除/挿入する前にデータを操作する必要があります。

結合モデルの自動削除は直接行われるため、破壊コールバックはトリガーされません。」これにはコールバックを使用できません。

タスクでは、タスクが保存された後にプロジェクトの値を計算するためにすべての project_ids が必要です。関連付けを介して has_many で削除を無効にするか、destroy に変更するにはどうすればよいですか? この問題のベストプラクティスは何ですか?

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
4

4 に答える 4

61

関連付けコールバック、、 before_addまたはを使用する必要があるようafter_addですbefore_removeafter_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   
于 2012-05-15T12:15:59.447 に答える
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
于 2015-09-03T19:31:06.687 に答える