Before_destroy:删除多对多关联,除非association.size> 1

时间:2014-01-28 20:15:02

标签: ruby-on-rails ruby-on-rails-4 many-to-many destroy before-filter

many-to-manyUser之间有Project关联,Participation加入。

user实例被删除时,我想删除所有user.projectsuser.participations如果没有其他userprojects相关联。

我尝试过以下操作,但似乎用户在方法运行时已经被破坏了:

before_destroy :destroy_all_projects_if_only_user

private
def destroy_all_projects_if_only_user
  self.projects.each do |project|
    unless project.users.size > 1
      project.destroy
    end
  end
end

1 个答案:

答案 0 :(得分:0)

听起来你要完成两件事:首先,破坏连接表中的关联,然后销毁相关对象,如果它们是孤立的。这是你可以做到的一种方式:

在您的用户模型中:

class User < ActiveRecord::Base
  # clear all project associations for this user
  before_destroy { projects.clear }

  # clean up any orphaned projects in the database
  after_destroy { Project.where("id NOT IN (SELECT project_id FROM participations)").destroy_all }
end

此方法不仅删除刚删除的用户的孤立项目,还删除可能在数据库中挥之不去的任何其他孤立项目。