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

问题描述 投票:1回答:1

我有一个用户模型,我想分配给老师或学生(老师和学生是两个分开的模型),因为如果用户注册,他会有不同的注册字段,具体取决于他是教师还是学生。用户可以是教师或学生,而不是两者。

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

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
ruby-on-rails ruby rails-models
1个回答
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 # ...表单。

有一点需要注意,它全部放在DB中的Single表中(因此名称为Single Table Inheritance),这意味着无关字段的很多NULL值(比如说Teacher有一个teacher_identification_number,而用户有student_identification_number,它们是不同的对于所有属性teacher_identification_number将为NULL的学生来说,或者他们需要不同的验证),反之亦然。

如果两个模型之间的字段差别很大,那么您可以分析您的数据并将其放在只有教师/学生可以访问的不同表中,这称为数据库规范化(例如Teacher has_many ClassInfo's或has_one JobInfo ;或Teacher has_one TeacherProfile,和Student has_one StudentProfile或其他)。

这一切都取决于你如何建模你的数据库。

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

© www.soinside.com 2019 - 2024. All rights reserved.