gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 23:06:25 25 4
gpt4 key购买 nike

我有一个带有“成员”、“组”、“成员”和“用户”的模型。数据以树状结构组织,其中的组具有与其关联的成员。没有任何组关联的成员被视为孤儿,对应用程序没有用处。

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

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

我的问题:在 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

最佳答案

我通过在 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

关于ruby-on-rails - 在 Rails 3 中通过关联使用 has_many 防止孤立对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11280630/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com