0

我们有一个非常简单的团队和角色模型

class Group < ActiveRecord::Base
  has_many :roles, :dependent => :destroy
end


class Role < ActiveRecord::Base
  belongs_to :group
  after_destroy :ensure_last_role

  private
  def ensure_last_role
    raise "Can't delete last role" if group.roles.count.zero?
  end  
end

after_destroy 完美运行,不允许最后一个角色被意外破坏。但这也可以防止该组在 :dependent => :destroy 尝试销毁所有角色时被销毁。当一个组被破坏时是否可以不调用 ensure_last_role 或者有更好的方法来解决这个问题?

4

1 回答 1

2

在玩了一会儿之后,我选择了一个不使用 Rails 内置dependent: :destroy的关系的解决方案,因为我无法让回调以正确的顺序触发。缓存也有一些问题,所以每次你尝试销毁 aRole时,它都会做一个小的 SQL 查询来查看它的组是否仍然存在于数据库中:

> role.destroy
  Group Exists (0.2ms)  SELECT 1 FROM "groups" WHERE "groups"."id" = 18 LIMIT 1

无论如何,这是完整的模型代码:

class Group < ActiveRecord::Base
  has_many :roles
  after_destroy :destroy_roles

  def destroy_roles
    roles.each { |r| r.destroy }
  end
end

class Role < ActiveRecord::Base
  belongs_to :group
  before_destroy :ensure_last_role, if: "Group.exists?(group_id)"

  private

  def ensure_last_role
    raise "Can't delete last role" if group.roles.count == 1
  end
end
于 2012-08-12T03:43:33.120 回答