将用户模型分配给两个模型之一?

时间:2019-04-29 11:52:07

标签: ruby-on-rails ruby rails-models

我有一个要分配为教师或学生的用户模型(教师和学生是两个分离的模型),因为如果用户注册,则他将根据他是教师还是学生而具有不同的注册字段。用户可以是老师或学生,不能两者都是。

我已经尝试过,但是不要以为这是最好的方法。有帮助吗?

class User < AR
  has_secure_password

  has_one :teacher, class_name: "teacher", foreign_key: "teacher_id", conditions: { role: 'teacher' }
  has_one :student, class_name: "student", foreign_key: "student_id", conditions: { role: 'student' }

  enum role: [:teacher, :student]
end

class Teacher < AR
  belongs_to :user, class_name: "user", foreign_key: "user_id"
end

class Student < AR
  belongs_to :user, class_name: "user", foreign_key: "user_id"
end

1 个答案:

答案 0 :(得分:1)

这是您如何针对案件实施STI的方法

class User < AR
  has_secure_password

  # Make all forms with User data send params with ':user' as a param key
  # instead of ':user_teacher'/':user_student'
  def self.model_name
    ActiveModel::Name.new(self, nil, 'User')
  end
end

class Teacher < User
  # custom methods 
end

class Student < User
  # custom methods
end

这样,您可以将表单与form_for @user do # ...一起使用。

一个警告,所有这些都放置在数据库的Single表中(因此命名为Single Table Inheritance),这意味着许多不相关字段的NULL值(例如Teacher具有一个{{1 }},并且用户拥有teacher_identification_number,它们的大小不同或需要不同的验证),所有拥有student_identification_number属性的学生将为NULL,反之亦然。

如果两个模型之间的字段相差很大,那么您可以分析数据并将其放在只有教师/学生可以访问的不同表中,这称为数据库规范化(例如{{1 }} teacher_identification_number Teacherhas_many ClassInfo;或has_one JobInfo Teacherhas_one { {1}} TeacherProfile或其他任何内容。

这实际上取决于您如何对数据库建模。

参考文献:
 -Blog Post - Medium - STI
 -Video Link - Drifting Ruby - STI
 -Video Link - @ RailsCasts - STI
 -Blog Post - StudyTonight - DB Normalization