1

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

我最初创建了两个设计模型:雇员和雇主。这是如此活跃的记录关联会很简单(雇主 has_many 员工,员工 has_many 凭证)。但这也意味着单独的数据库表和单独的登录表单。

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

接下来我研究了子类化,这样我就可以进行关联了,但它存在一些问题,因为人们说 Rails 并不是真的要子类化,而且它似乎有点 hacky。

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

4

1 回答 1

3

所以我的一个朋友非常优雅地为我解决了这个问题,供大家参考:

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

假设员工和雇主有足够的差异,将它们作为单独的模型来实现是有意义的。但在表格中使用单一登录也是有意义的——员工和雇主不必关心他们是否签署了正确的表格。

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

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

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

在雇主/雇员协会方面,和以前一样:

  • 员工属于_to :employer
  • 雇主 has_many :employees

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

因此,现在您需要在登录凭据与雇主和雇员之间创建关联:

  • SignIn :belongs_to :signinable, 多态性: true
  • 雇主 has_one :sign_in, as: :signinable
  • 员工 has_one :sign_in, as: :signinable

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

于 2013-07-29T10:27:51.483 回答