具有rails的多级用户的数据库设计

时间:2011-10-18 21:39:42

标签: ruby-on-rails database-design associations

我有一个供用户使用的数据库表,其中包含密码,电子邮件等常用字段。此外,还有一个名为level的字段,用于定义用户级别,例如 member < / em>,编辑 admin

还有一些特定于其他人不需要的成员,编辑和管理员的字段。所以我认为我应该为用户类型创建单独的表。

这就是问题; 如果我想遵循Rails方式,我应该如何解决这个问题呢?在数据库设计和关联方面都是如此。

1 个答案:

答案 0 :(得分:2)

似乎您正在寻找基于角色的授权系统,以及每个角色的特定属性。实现这一目标的一种方法是使用如下数据模型:

.-------.1    *.------------.*     1.-------.
| users |<-----| user_roles |------>| roles |
'-------'      '------------'       '-------'
                     |
     .---------------+---------------------.
     |0..1           |0..1                 |0..1
 .--------.  .----------------------.  .----------.
 | points |  | some_other_attribute |  | room_ids |
 '--------'  '----------------------'  '----------'

这样,如果从用户中删除了该角色(通过级联删除),则可以确保删除与特定角色相关的所有属性。

但是,您将确保所有属性模型都执行如下验证规则:

class Point < ActiveRecord:Base
    validates :relevant_association?

  def relevant_association?
    user_role.role.title == "Admin"
  end
end

如果您的用户只能拥有一个角色,您可以通过在模型上添加role字段来简化此操作,然后相应地在可选属性(belong_to用户)上编写验证规则。尽管如此,前一种模式为未来的调整提供了更多的潜力(创造一个新的角色只是创造一个新的记录)。

我不是这方面的专家,所以你也可以继续寻找灵感; declarative_authorization gem提供了您可能感兴趣的数据模型的解释:

                     includes                   includes
                      .--.                        .---.
                      |  v                        |   v
.------.  can_play  .------.  has_permission  .------------.  requires  .----------.
| User |----------->| Role |----------------->| Permission |<-----------| Activity |
'------' *        * '------' *              * '------------' 1        * '----------'
                                                    |
                                            .-------+------.
                                         1 /        | 1     \ *
                               .-----------.   .---------.  .-----------.
                               | Privilege |   | Context |  | Attribute |
                               '-----------'   '---------'  '-----------'