【问题标题】:How to model different users in Rails如何在 Rails 中为不同的用户建模
【发布时间】:2013-01-23 16:16:18
【问题描述】:

问题

我有一个带有授权和身份验证逻辑的用户模型。

现在我意识到我拥有三种不同类型的用户。我想存储关于他们每个人的不同信息。

在 Rails 中处理这个问题的最佳方法是什么?

基于当前阅读的想法

我查看了 STI,但从我读到的内容来看,这不合适,因为我的数据库中会出现很多 NULL 字段。

理想情况下,我不想为这三种用户类型中的每一种重复身份验证/授权逻辑。

每个用户在应用程序中也将拥有不同的功能。

【问题讨论】:

  • 你应该在你的模型/数据库中添加一个 user_type 属性,然后设置一个模型来映射 user_types 和他们被允许使用的活动/功能。
  • 但这仍然意味着我有一个用户表,对吧?因此,如果我想为一个用户(A 类)存储姓名和电子邮件,为另一个用户(B 类)存储姓名、电子邮件、地址、dob、电话,我创建的每个 A 类用户仍然有很多空字段。
  • 您应该设置一个通用字段。在 Rails 中,这就是 Active Record 中的序列化/反序列化功能派上用场的地方。有更好的数据结构可以使用,比如数组等……但为了方便起见,我们就用这个吧。在 models/user.rb 中设置一个文本字段并将自定义/变量选项存储在单个字段中。称它为 user_profile。该列的一条记录可能看起来像“dob: 031388\nphone:8312229999\nemail:user@hotmail.com”.....然后您只需通过“\n”字符拆分/加入字段
  • 然后您可以使用活动记录回调和控制器(尽管我确信在控制器中这样做会违反 Rails 最佳实践)在上传之前调整表单字段中的数据。 ...然后为了显示数据,您可以轻松地将其拆分并写在单独的 div 中

标签: ruby-on-rails database-design model single-table-inheritance


【解决方案1】:

有很多方法可以做到这一点。这是一种方法:

您可以考虑用户拥有的角色,而不是考虑不同类型的用户。

例如,如果用户可能是屠夫、面包师或烛台制造商,您可以有四个表:usersbutchersbakerscandlestick_makers。后三个角色表各有一个user_id 列;它们“属于”用户。

如果您需要强制特定用户只有一个角色,则必须在应用程序中执行此操作(因为此数据库架构允许单个用户拥有多个角色)。

如果有很多内容属于这些角色表,则此方法很好。如果没有,在 users 表上留下一些 NULL 列可能不会杀死你。

【讨论】:

  • 如果我有 3 个单独的表,那么屠夫、面包师和烛台制造商都可以使用我的用户模型中的逻辑登录吗?
  • 这个想法是认证只看你的用户模型;登录后,您可以根据是否为user.butcher_role != nil 等进行重定向。
【解决方案2】:

您可以尝试使用polymorphic associations 并使用所有类型用户拥有的数据创建表users,并将其他数据放在单独的表中。 Railscast epizode 涵盖此主题。

【讨论】:

  • 我尝试使用此处答案中概述的多态关联(创建与用户关联的不同配置文件),但我无法让它工作。 stackoverflow.com/questions/7719600/… -- 我没有想过按照你建议的方式使用多态关联,这可能就是我要找的:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
  • 1970-01-01
  • 1970-01-01
  • 2016-12-30
  • 1970-01-01
相关资源
最近更新 更多