所以我的一个朋友非常优雅地为我解决了这个问题,供大家参考:
好问题。处理良好工程(模型实现、数据库设计)和用户体验(单一登录表单)之间的交叉点是一个很好的问题。
假设员工和雇主有足够的差异,将它们作为单独的模型来实现是有意义的。但在表格中使用单一登录也是有意义的——员工和雇主不必关心他们是否签署了正确的表格。
单表继承通常看起来是理想的解决方案,但在 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 模型,可以轻松实现更好的登录表单体验,让雇主和雇员都可以登录。