如何为 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
模型来处理身份验证,并将其与具有给定用户类型所需属性的适当StudentProfile
、TeacherProfile
等模型相关联
多表继承并不是 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 创建类型安全的用户角色?