我正在重写一些 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 使用角色/身份验证插件,因为它们依赖于用户作为特定角色。在这里,角色随权限而变化。用户可以是组的管理员,但也可以是图像的协作者。