我有一个供用户使用的数据库表,其中包含密码,电子邮件等常用字段。此外,还有一个名为level
的字段,用于定义用户级别,例如 member < / em>,编辑或 admin 。
还有一些特定于其他人不需要的成员,编辑和管理员的字段。所以我认为我应该为用户类型创建单独的表。
这就是问题; 如果我想遵循Rails方式,我应该如何解决这个问题呢?在数据库设计和关联方面都是如此。
答案 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 | '-----------' '---------' '-----------'