我倾向于#1,但使用 STI(单表继承)——它并不总是最好的解决方案,但在这里可能很合适,至少值得尝试
类似于:
- 使用 devise 并生成一个 User 模型和表,让 devise 处理所有用户身份验证 - 默认情况下它将使用 users.email 作为登录名,继续使用
- 将“类型”列(字符串)添加到 STI 的用户表
- 在用户表中添加一个“昵称”列,在 UI 中显示,不需要它在讲师和学生之间是唯一的
实现从 User 继承的 Lecturer 和 Student 模型
class User < ActiveRecord::Base
# all of the devise code
# ...
def is_student?
type == "student"
end
# ...
class Lecturer < User
# ...
class Student < User
# ...
设计将在您的控制器中注入该current_user
方法,您可能需要/想要覆盖它。通常它会返回一个用户对象,您可以使用becomes
它来将其转换为适当的子类 - 请参阅http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-becomes
def current_user
return nil unless @current_user
if @current_user.is_student?
@current_user.becomes(Student)
elsif @current_user.is_lecturer?
@current_user.becomes(Lecturer)
else
@current_user
end
end
或者根本不要与 current_user 混淆,而是添加您自己的current_student
和current_lecturer
方法
# nil if not a student
def current_student
current_user.becomes(Student) if current_user.is_student?
end
注意:此代码均未经过测试,您的里程可能会有所不同