开发者

Rails - Help understanding how to use :dependent => :destroy

I have the following models:

User (id)
Project (id)
Permission (project_id, user_id)
Thread (project_id)
ThreadParticipation (thread_id, user_id)

So that's working nicely, problem is this. When a user leaves or is removed from a project, I need all their ThreadParticipation's for that project deleted.

Example, so if user(15), leaves project(3) by deleting the permission (user_id =>15, project_id => 3), I need rails to automatically then delete all related ThreadParticipation records (where ThreadParticipation through thread, belongs to project_id 3, and ThreadParticipation.user_id = 15.

I've tried this, but it's not doing anything:

has_many 开发者_C百科:thread_participations, :foreign_key => :user_id, :dependent => :destroy

Thoughts? Thanks


Are you maybe using delete instead of destroy? Using destroy will cause dependents to be removed while delete does not. see this


In the Permission Model, do this:

before_destroy :delete_thread_participation

private
      def delete_thread_participation
         if self.threadparticipation 
           self.threadparticipation.delete_all "project_id ="+self.project_id+"and user_id="+self.user_id
         end
      end

This is considering you have relationships defined in the models


Try this:

class Project
  has_many :threads
  has_many :thread_participations, :through => :threads      
end

class Permission
  belongs_to :project

  after_destroy :destroy_thread_participations

  def destroy_thread_participations
    ThreadParticipation.delete_all(
      :id => project.thread_participations.find_all_by_user_id(user_id)
    )
  end
end

Use destroy_all instead of delete_all if you have *_destroy callbacks in the ThreadParticipation model. The delete_all call is faster than destroy_all as it performs deletion of multiple rows in one DB call and does not have the overhead of invoking the *_destroy callbacks.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜