1

我正在重写一些 Rails 3 应用程序逻辑,我想请你对我的数据库建模动脑筋。

在我的应用程序中,用户可以访问页面、组和图片。作为多态关联,这很容易做到:

class Permission < ActiveRecord::Base
  belongs_to :resource, :polymorphic => true 
  belongs_to :user
end

class User < ActiveRecord::Base
  has_many :permissions
end

class Page < ActiveRecord::Base
  has_many :permissions, :as => :resource
end

# the same for Page and Picture

但是,这些权限也需要具有不同的类型,例如 AdminPermission、CollaboratorPermission、OwnerPermission。我该怎么做呢?我希望能够做到这一点:

p = Page.first
u = User.first
u.admin_permissions.create(:resource => p) 

# should return AdminPermission class, not just Permission
per = User.first.permissions.first 
# should return Page
per.resource

我的问题是:我该如何建模?为每个对象创建一个 Permission 类,而不是在一个类中完成所有这些会更好吗?有这样做的聪明方法吗?我不太喜欢为 Rails 使用角色/身份验证插件,因为它们依赖于用户作为特定角色。在这里,角色随权限而变化。用户可以是组的管理员,但也可以是图像的协作者。

4

1 回答 1

2

如果您不需要滚动自己的授权,您可以查看CanCan和 Ryan Bates关于如何为不同项目的不同用户定义不同能力的评论。您可以阅读它以获取完整的详细信息,但它涉及覆盖 current_ability 方法。

# in controller
def current_ability
  @current_ability ||= Ability.new(current_user, current_project)
end

# in Ability class
def initialize(user, project)
  if user.admin_for_project?(project)
    can :manage, :all
  else
    can :read, :all
  end
end
于 2012-11-02T15:52:44.163 回答