防止孤立对象,通过关联has_many,在 Rails 3 中



我有一个包含"成员"、"组"、"成员"和"用户"的模型。数据以树结构进行组织,其中包含具有与其关联的成员的组。没有任何组关联的成员被视为孤立成员,对应用程序没有任何用处。

当用户销毁组时,不应留下任何孤立成员。换句话说:当且仅当删除最后一个组关联时,才应销毁成员。最好这应该发生在单个事务中,但最重要的方面是孤立对象不会随着时间的推移在数据库中累积。

仅应删除与用户关联的成员和组。其他用户拥有的组、成员和成员资格根本不应受到影响。(有人可能会争辩说,全局清理方法可以随时运行,但我想隔离破坏性操作以仅影响当前用户对象。

我的问题:在 Rails 3 中实现此功能的最有效、最优雅的方法是什么?我当前的实现(由此处描述的简化模型说明)不会从数据库中删除成员,除非用户手动删除它(或者通过级联删除删除整个用户及其所有数据)。

class User < ActiveRecord::Base
  has_many :groups, :foreign_key => 'owner_id', :dependent => :delete_all
  has_many :members, :foreign_key => 'owner_id', :dependent => :destroy
end
class Member < ActiveRecord::Base
  belongs_to :owner, :class_name => 'User'    
  has_many :memberships, :dependent => :destroy
  has_many :groups, :through => :memberships
end
class Membership < ActiveRecord::Base
  belongs_to :member
  belongs_to :group
end
class Group < ActiveRecord::Base
  belongs_to :owner, :class_name => 'User'
  belongs_to :parent, :class_name => 'Group'    
  has_many :groups, :foreign_key => 'parent_id', :dependent => :destroy
  has_many :memberships, :dependent => :destroy
  has_many :members, :through => :memberships
end

我通过在成员资格类中添加一个回调来解决这个问题,该回调会在成员资格被销毁时通知成员。然后,如果成员对象不再具有任何组关联,则会销毁自身。

class Membership < ActiveRecord::Base
  belongs_to :member
  belongs_to :group
  after_destroy :notify_member
  def notify_member
    member.destroy_if_empty_groups
  end
end
class Member < ActiveRecord::Base
  belongs_to :owner, :class_name => 'User'    
  has_many :memberships, :dependent => :destroy
  has_many :groups, :through => :memberships
  def destroy_if_empty_groups
    if groups.count == 0
      self.destroy
    end
  end
end

相关内容

  • 没有找到相关文章

最新更新