加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 在Rails 3中使用has_many通过关联防止孤立对象

发布时间:2020-12-17 03:46:42 所属栏目:百科 来源:网络整理
导读:我有一个模型有“成员”,“组”,“成员”和“用户”.数据以树结构组织,其中包含与其关联的成员的组.没有任何组关联的成员被视为孤儿,对申请没有用处. 当用户销毁一个组时,不应该留下任何孤立的成员.换句话说:当且仅当最后一个组关联被删除时,才应销毁成员.
我有一个模型有“成员”,“组”,“成员”和“用户”.数据以树结构组织,其中包含与其关联的成员的组.没有任何组关联的成员被视为孤儿,对申请没有用处.

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

只应删除与该用户关联的成员和组.其他用户拥有的组,成员和成员资格不应受到任何影响. (有人可能认为可以随时运行全局清理方法,但我想隔离破坏性操作以仅影响当前用户对象.)

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

class User < ActiveRecord::Base
  has_many :groups,:foreign_key => 'owner_id',:dependent => :delete_all
  has_many :members,: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

解决方法

我通过在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,:through => :memberships

  def destroy_if_empty_groups
    if groups.count == 0
      self.destroy
    end
  end
end

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读