2011-02-14 20 views
2

我有以下型号:导轨 - 帮助了解如何使用:依赖=>:摧毁

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

所以这是很好的工作,问题是这样的。当用户离开或从项目中移除时,我需要删除该项目的所有ThreadParticipation。例如,如果用户(15)通过删除权限(user_id => 15,project_id => 3)离开项目(3),我需要rails自动删除所有相关的ThreadParticipation记录(其中ThreadParticipation通过线程,属于PROJECT_ID 3,和ThreadParticipation.user_id = 15

我已经试过这一点,但它没有做任何事情:

has_many :thread_participations, :foreign_key => :user_id, :dependent => :destroy 

思考感谢

回答

1

Permission模式,做到这一点:

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 

这是考虑到你在模型

+0

谢谢,但我不希望在用户被删除时发生这种情况。我想在删除PERMISSION时删除ThreadParticipations。权限将用户加入到项目中。 – AnApprentice

+0

已编辑。你也可以通过在'delete_thread_participation'中调用一个函数,比如'self.user_id.some_function'或'self.project_id.some_function'来获得级联效果。 – ajmartin

+3

这不会比delete_all(:project_id => project_id,: user_id => user_id)# –

1

试试这个定义的关系:

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 

使用destroy_all而不是delete_all,如果你有在ThreadParticipation模型*_destroy回调。 delete_all调用比destroy_all更快,因为它在一次数据库调用中删除多行,并且没有调用*_destroy回调的开销。

+0

只是给了这个尝试,它错误与:ActiveRecord :: HasManyThroughAssociationNotFoundError:无法找到模型中的关联:线程权限 – AnApprentice

+0

我这是bec线程不属于权限。线程属于项目。并且用户拥有将用户/项目链接在一起的权限记录。 – AnApprentice

+0

更新了我的答案看一看。 –

2

你可能使用delete而不是destroy?使用destroy将导致家属被移除,而delete不会。 see this

+0

谢谢,但它的破坏 – AnApprentice