我正在创建一个在线房地产平台,以促进(正常)用户和房地产代理商。此平台具有以下用户类型:
每个用户类型都有不同的字段(每个字段有4到6个字段)。普通用户和代理商可以自行注册。员工和管理员可以分别由代理商和超级管理员注册。此外,用户类型还有一些不同的多个角色(与此案例讨论无关)。
目前,我有三种不同的设计模型(用户,代理商和超级管理员)。他们有不同的登录和注册表格但共享相同的会话[参考:[https://github.com/plataformatec/devise/wiki/How-to-Setup-Multiple-Devise-User-Models]][1]用户有通过社交媒体(OmniAuth)注册的工具,但代理商必须通过私人电子邮件ID注册。管理员只会由超级管理员注册。
这里有[问题]:
以下字段是我在上述三种用户类型之间共享的标识:Email address & Username
它们必须对所有情况都是唯一的。例如,如果代理商拥有用户名,则用户无法使用相同的用户名注册。目前,我们没有满足上述要求,因为我们为不同类型的用户提供了不同的表/模型。
我的计划
现在,由于这些都是与应用程序的不同部分进行交互的真正不同的用户,因此拥有三种不同的设计模型感觉很干净。因此,我认为创建一个父设计模型应该由所有类型的用户模型继承。这种方式可以帮助我解决我的问题。但现在,我并不相信我如何继承父设计模型并将其用于我的案例。
第二个选项是使用STI(单表继承)。但我对这种方法的主要担心是它会造成注册和安全问题的混乱。
现在这是我研究选项的问题。你会建议我选择什么?而且,如果你举一个详细的例子,它会很棒。
P.S。我倾向于第一个选项,因为我已经完成了三个不同的模型和他们的登录/注册的东西。 :)
答案 0 :(得分:3)
不确定如何在没有角色系统的情况下实现这一目标。我认为你可以命名或限制它,但不能最安全地访问特定的用户组。至少在我的意见中。
您可以使用单表继承(STI)..
基本上你可以做这样的事情(如果我理解你的话)
class User < ApplicationRecord
# MASTER
end
class AnotherUser < User
# Inherits attributes from User Table
end
走这条路线,您需要将type:string
添加到您的用户模型中。
这里有一些参考链接:
http://api.rubyonrails.org/classes/ActiveRecord/Inheritance.html http://eewang.github.io/blog/2013/03/12/how-and-when-to-use-single-table-inheritance-in-rails/
当我冒险沿着STI路径行进时,他们帮助了我。例如,在一个项目中,我这样做了:
class User < ApplicationRecord
# Devise Modules Here
end
class Admin < User
end
class SuperAdmin < User
end
现在我找到的棘手部分是创建这些用户..我选择创建一个控制器和一个链接,所以在我的应用程序中,用户只能由admin或superadmin创建,而管理员只能通过superadmin创建