如何为 Rails 中枚举中列出的角色添加模型?

Posted

技术标签:

【中文标题】如何为 Rails 中枚举中列出的角色添加模型?【英文标题】:How to add a model for the roles listed in the enum in Rails? 【发布时间】:2019-11-06 23:12:06 【问题描述】:

我在我的应用程序中使用 devise 和 Pundit。我有很多用户,例如学生、教师、管理员、编辑。我在我的用户设计模型中添加了一个枚举角色。现在我不理解的部分是-学生将有自己的属性,同样,老师也将有自己的属性。例如,学生将有学校名称,而老师将有一个班级。现在,如果我将所有内容都放在用户模型中,我将有许多空值。我如何使用这个角色为每个角色创建一个模型,即学生、教师、赞助商,这样我就可以添加那些拥有各自学生、教师、赞助商模型的额外属性。任何帮助将不胜感激

枚举角色:[:teacher, :student, :sponsor, :admin]

预期结果:拥有一个具有与模型本身相关的属性的模型。例如。 Student 在其模型中将有一个名为 School 的列,而不是 User 模型。

【问题讨论】:

你想过单表继承吗? api.rubyonrails.org/classes/ActiveRecord/Inheritance.html 我进行了调查,发现 enum 角色将更适合我的方法,因为我将使用 Pundit 。此外,一个用户不能拥有多个角色。我不会使用多态或 STI。 您可以拥有一个基本的User 模型来处理身份验证,并将其与具有给定用户类型所需属性的适当StudentProfileTeacherProfile 等模型相关联 多表继承并不是 Rails 擅长的。我遇到过类似的问题,并且使用过像 active_record-acts_as 这样的宝石。如果它们足够不同以至于 STI 或枚举没有意义,那么接受一些重复的代码并制作单独的模型可能会更好。否则它会变得过于复杂。 正如@Jon 所提到的,您需要使用用户模型进行身份验证和授权,并将每个配置文件存储在需要验证的不同模型中。你需要为此使用多态。 【参考方案1】:

感谢您的帖子!我也在找向导。

class User < ApplicationRecord 
has_one :profile
has_many :clas-s-rooms

enum role: [:teacher, :student, :sponsor, :admin]
end

一个。这是否意味着所有角色都具有来自关联的属性?

b.对于 STI...是否意味着子类中的所有关联都将保留为空?

class Teacher < User
  has_many :clas-s-rooms
end

谢谢!

【讨论】:

以上是关于如何为 Rails 中枚举中列出的角色添加模型?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Spring Security 创建类型安全的用户角色?

如何为 Rails 控制器添加延迟以进行测试?

如何在 Rails 应用程序中为我的用户添加角色?

如何为 GitHub 组织添加自定义用户角色?

Ruby on Rails - 如何为同一操作添加第二条路线?

[小技巧]C#中如何为枚举类型添加描述方法