我的模特有“会员”,“团体”,“会员”和“用户”。数据以树结构组织,其中包含与其关联的成员的组。没有任何团体关联的成员被认为是孤儿,对申请没有用处。
当用户销毁群组时,不应该留下任何孤儿。换句话说:当且仅当最后一个组关联被删除时,才应销毁成员。优选地,这应该在单个事务中发生,但最重要的方面是孤立对象不随时间累积在数据库中。
只应删除与该用户关联的成员和组。其他用户拥有的组,成员和成员资格不应受到任何影响。 (有人可能认为可以随时运行全局清理方法,但我想隔离破坏性操作以仅影响当前用户对象。)
我的问题:在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
答案 0 :(得分:9)
我通过在Membership类中添加一个回调来解决这个问题,该类会在成员资格被销毁时通知成员。如果成员对象不再具有任何组关联,则该成员对象将自行销毁。
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