2011-10-18 123 views
0

我有一个数据库表为用户其中包含常见的领域,如密码,电子邮件等而且还有一个名为level场定义用户级别,如成员编辑admin数据库设计的多级用户与导轨

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

这就是问题; 如果我想遵循Rails的方式,我应该如何处理这个问题?无论在数据库设计和关联方面。

+1

你应该更具体的了解您的需求。那些额外的领域是什么?你认为你以后需要更多的“角色”吗?一个用户可以同时拥有多个“角色”吗?乍一看,我想说为不同的用户类型创建多个表是一个坏主意:用户是用户,无论其类型如何,并且风险最终都会在单独的表上出现重复。另一个建议是查看一些[授权宝石](https://www.ruby-toolbox.com/categories/rails_authorization)寻求灵感。 –

+0

我也不想为用户使用多个表格,但用户类型需要'points'字段来执行某些操作,而其他用户类型则必须与'room'表格有关联,而其他用户类型则需要。因此,为每个用户创建'room_id',而他们并不需要它,这对我来说似乎有点不对劲。 “点”字段右侧也是这样吗?那么我应该在这种情况下使用多个表吗? –

回答

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 | 
           '-----------' '---------' '-----------'