多个设计模型与基于权限的

时间:2013-07-28 13:46:23

标签: ruby-on-rails devise

我正在构建的应用程序是允许用户下载凭证。雇主注册一个帐户,添加员工(登录者),选择要启用的凭证,然后员工可以看到启用的凭证并下载。

我最初创建了两个设计模型:员工和雇主。这是如此活跃的记录协会将是简单的(雇主has_many员工,员工has_many代金券)。但这也意味着单独的数据库表,因此分开登录表单。

我查看了多个用户的单点登录表单,this似乎已达成共识,您应该使用单个用户模型并使用CanCan和Rolify获取权限。但 的问题是你不能(我相信?)在这两个角色(不是单独的模型)之间进行主动记录关联。

我接下来看了子类化,所以我可以做关联,但它has issues正如人们所说Rails并不是真正意义上的子类,而且看起来有点hacky。

所以我感觉我必须选择较少的邪恶,而我真的只是想找到正确的方法..提前感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

所以我的一位朋友为我解决了这个问题,为每个人提供参考:

好问题。处理良好工程(模型实现,数据库设计)和用户体验(单点登录)之间的交叉是一个很大的问题。

假设员工和雇主的差异很大,将它们作为单独的模型实施是有意义的。但是,只有一个单一的签到形式是有意义的 - 员工和雇主不应该关心他们是否签署了正确的形式。

单表继承通常似乎是理想的解决方案,但在Ruby on Rails应用程序中最好避免使用,除非绝对必要。

我之前实际上已经考虑过这个问题了,所以我建议按照以下方式进行实施:

  • 雇主模特。
  • 员工模特。
  • 一个SignIn / Login / Credentials / WhateverYouWantToCallIt模型。

就雇主/雇员协会而言,如前所述:

  • 员工belongs_to:雇主
  • 雇主has_many:员工

现在,考虑到两种模型都能够登录,将这些凭据分成自己的SignIn模型是有意义的。如果您对多态关联(http://guides.rubyonrails.org/association_basics.html#polymorphic-associations)进行了一些阅读,您会发现它们对于创建关联可以与不同模型建立关系非常棒。

所以现在你需要在登录凭证与雇主和雇员之间建立联系:

  • SignIn:belongs_to:signinable,polymorphic:true
  • 雇主has_one:sign_in,as :: signinable
  • 员工has_one:sign_in,as :: signinable

这个解决方案(在我看来)的优雅之处在于,您可以将您的SignIn,Employer和Employee模型分开,这些模型不仅符合良好的Ruby on Rails约定,而且是良好的数据库规范化实践。与此同时,您有一个SignIn模型,可以轻松实现更好的登录表单体验,允许雇主和员工登录。