设计模型继承自另一个设计模型

时间:2016-11-03 06:16:49

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4

我正在创建一个在线房地产平台,以促进(正常)用户和房地产代理商。此平台具有以下用户类型:

  • 普通用户可以搜索房屋出租/购买,评论代理商 等
  • 代理机构可以上传房屋租赁/销售等帖子
  • 员工:适用于代理机构
  • 超级管理员管理网站
  • 团队成员:管理由Super Admin委派的部分网站

每个用户类型都有不同的字段(每个字段有4到6个字段)。普通用户和代理商可以自行注册。员工和管理员可以分别由代理商和超级管理员注册。此外,用户类型还有一些不同的多个角色(与此案例讨论无关)。

目前,我有三种不同的设计模型(用户,代理商和超级管理员)。他们有不同的登录和注册表格但共享相同的会话[参考:[https://github.com/plataformatec/devise/wiki/How-to-Setup-Multiple-Devise-User-Models]][1]用户有通过社交媒体(OmniAuth)注册的工具,但代理商必须通过私人电子邮件ID注册。管理员只会由超级管理员注册。

这里有[问题]:

以下字段是我在上述三种用户类型之间共享的标识:Email address & Username它们必须对所有情况都是唯一的。例如,如果代理商拥有用户名,则用户无法使用相同的用户名注册。目前,我们没有满足上述要求,因为我们为不同类型的用户提供了不同的表/模型。

我的计划

现在,由于这些都是与应用程序的不同部分进行交互的真正不同的用户,因此拥有三种不同的设计模型感觉很干净。因此,我认为创建一个父设计模型应该由所有类型的用户模型继承。这种方式可以帮助我解决我的问题。但现在,我并不相信我如何继承父设计模型并将其用于我的案例。

第二个选项是使用STI(单表继承)。但我对这种方法的主要担心是它会造成注册和安全问题的混乱。

现在这是我研究选项的问题。你会建议我选择什么?而且,如果你举一个详细的例子,它会很棒。

P.S。我倾向于第一个选项,因为我已经完成了三个不同的模型和他们的登录/注册的东西。 :)

1 个答案:

答案 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创建