2012-01-24 7 views
2

PostgreSQLをデータベースとして使用し、Rails 3.1.3とruby 1.9.3 私は3つのモデルを持っています。Railsのafter_destroyコールバックオーダー

  • Activity
  • ActivityObject
  • ActivityObjectActivity

彼らがこのように関連しています。

活性

にhas_many:activity_object_activities:依存=>:
にhas_manyを破壊:activity_objects、:=>スルー:

after_destroyをactivity_object_activitiesは:

ActivityObjectをdo_something_on_activity_object_related

にhas_many:activity_object_activities:依存=>:
にhas_manyを破壊する:活動、:=>スルー:=依存:活性:

ActivityObjectActivity

belongs_toのactivity_object_activities >:破壊する
belongs_to:activity_object

アクティビティを破壊すると、do_something_on_activity_object_relatedのコールの前にactivity_object_activitiesテーブルエントリが削除されていることがわかります。これはdependent: destroyです。 このため、アクティビティが破棄されたときにdo_something_on_activity_object_relatedメソッドが呼び出されると、そのアクティビティに関連付けられたactivity_objectを見つけることができません。

アクティビティに関連するアソシエーションが破棄される前に、これをdo_something_on_activity_object_relatedと呼ぶ方法がありますか。 after_destroyコールバックの順序を変更する方法はありますか。

ありがとうございました。

削除/破壊の依存関係のために責任を持って自分自身を取ると、あなたの do_something_on_activity_object_related

ので、代わりの

has_many :activity_object_activities,:dependent => :destroy 
has_many :activity_objects, :through => :activity_object_activities 

after_destroy :do_something_on_activity_object_related 

これを行う終了した後、彼らがトリガー得ることを確認でき

答えて

5

has_many :activity_object_activities 
has_many :activity_objects, :through => :activity_object_activities 

after_destroy do 
    do_something_on_activity_object_related 

    ActivityObjectActivity.destroy_all(activity_id: self.id) 
end 

ジョインテーブルからアイテムを削除するときは、の代わりにdelete_allを使用してください。しかし、私はここでそれを使用するためにあなたの例で破壊を使用しました。