我一直在用头撞墙,试图绕过这个,所以任何指导都将不胜感激......
我想要一个用户系统设置来反映以下层次结构:
User
|- email address
|- password
|- billing information
|- contact information
|- account preferences
|
|=> Agent
|=> - agent-specific information
|=> - has_many Users
|=> - belongs_to Manager
|
|=> Manager
|=> - manager-specific information
|=> - has_many Agents, Users
|
|=> Administrator
|=> - can manage everything
我已经有一个User
带有Devise和CanCan设置的模型来处理身份验证和授权,所以我知道如何使用角色将用户类型限制为特定操作,等等。
我迷失的是如何在我的 Rails 代码和数据库中组织这些子类关系。正如您从上面看到的Agent
,Manager
、 和Administrator
都共享包含在 中的信息User
,但每个都有附加的功能和与之相关的信息。
如果我使用 STI,该User
表必须包含我的所有 [ Agent
/ Manager
/ Administrator
] 特定信息的字段,对吗?那会使我的User
桌子很大,这是我想避免的。相反,如果我使用多态,那么我是否不必User
在所有其他类型的User
子类表中复制所有公共信息?
为了增加我的困惑,我无法理解上述问题的答案如何与子类之间的关系一起工作(例如,Manager
has_many Agents
,但两者都是User
...的子类??)。
我真的很感谢有人通过详细的回答让我明白这一点,该回答适当考虑了代码的可读性和数据完整性,它简单地解释了(就像对 Rails 新手一样)为什么 A 是最好的方法以及为什么 B 或n是——通过比较——对于这种情况不是一个好方法,并且给出了实现上述关系的示例代码。我想解决这个问题,但更重要的是,我想了解这个解决方案为什么有效!