【问题标题】:Assign user model to one of two models?将用户模型分配给两个模型之一?
【发布时间】:2019-04-29 11:52:06
【问题描述】:

我有一个用户模型,我想将其分配为教师或学生(教师和学生是两个独立的模型),因为如果用户注册,他将拥有不同的注册字段,具体取决于他是教师还是学生。用户可以是教师或学生,不能同时是两者。

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

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

【问题讨论】:

  • 在您的代码 sn-p 中使用完整形式的 AR。通过关联方法中提供的可选参数conditions 提及rails 版本,因为它闻起来像旧版本。此外,您不需要提供 class_nameforeign_key,因为 Rails 按照惯例考虑它们。
  • ApplicationRecord, 5.2.0 rails 我知道条件已被弃用,但还能使用什么?
  • 在您的情况下使用单表继承一定是一个不错的选择。
  • 使用单表继承你会得到 3 个模型:用户、教师和学生,但它都是 1 个表,你可以通过表单来区分用户的类型......跨度>

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


【解决方案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的学生来说,teacher_identification_number将为NULL,反之亦然。

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

这完全取决于您如何为数据库建模。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-10
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 2021-10-02
    • 2014-10-03
    相关资源
    最近更新 更多