0

让我们假设一个网站是否学生、讲师都可以登录。

这可以通过两种方式完成:

  1. 用户模型将在那里,并且 user_type 字段确保他是学生还是讲师。但是,通过这种方式,如果学生使用用户名“a”,那么讲师就不能使用相同的用户名“a”。因为它们都是不同的,例如 /profiles/lectureers/a。在这里,用户模型说'a'已经存在,但它属于学生而不是讲师,那么profiles/lectureers/a应该说什么?很奇怪,对吧?

  2. 在这里,不会有任何用户模型。使用不同的用户名将讲师和学生模型分开。Offourse,我们可以有一个通用的用户模型,包括姓名、地址、国家等通用内容。但是,用户名不应该在用户模型中。他们应该是学生、讲师的一部分。

只是没有得到什么开始?

你们有什么建议 ?1 还是 2?

谢谢。

4

3 回答 3

1

我倾向于#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_studentcurrent_lecturer方法

# nil if not a student
def current_student
  current_user.becomes(Student) if current_user.is_student?
end

注意:此代码均未经过测试,您的里程可能会有所不同

于 2013-09-14T18:04:34.047 回答
1

我认为这取决于您是否真的希望用户名是唯一的。当然,您始终可以将唯一字段设置为电子邮件,这可以解决问题。

一般来说,为简单起见,最简单的方法可能是使用一个用户模型(例如通过电子邮件区分),然后使用像cancan (https://github.com/ryanb/cancan这样的 gem来制作不同的角色。

对于身份验证,您还可以选择许多符合该要求的优秀宝石,最值得注意的是:

于 2013-09-13T19:22:10.730 回答
0

我不认为有一个简单的答案。如果您的应用程序只有StudentLecturer.

但是,当您需要拥有时会发生什么Classroom?一个classroom可以有多个lecturers和多个students。从右边Lecturer或右边查询仍然很简单?当你想寻找已经给出的课程时会发生什么?然后你有, , , , , 然后可能想要定义哪个讲师可以创建什么等等。当然所有这些都可以使用这些技术轻松解决,但是权衡是什么?StudentClassroomstudentslecturersFacultyCourseExaminationGradeGPASQLrails

所以我想我的回答是,除非你把所有这些都考虑在内,否则没有正确的方法

于 2013-09-15T02:32:03.080 回答