将用户模型分配给两个模型之一?
Assign user model to one of two 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
这是为您的案例实施 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 table 中(因此名称为 Single Table Inheritance),这意味着不相关字段的很多 NULL 值(比如Teacher
有一个 teacher_identification_number
,并且用户有 student_identification_number
,它们的大小不同或者他们需要不同的验证)对于属性 teacher_identification_number
将为 NULL 的所有学生,反之亦然-相反。
如果两个模型之间的字段有很大不同,那么您可以分析您的数据并将其放在不同的 table 中,只有 Teacher/Student 才能访问,这称为数据库规范化(例如 Teacher
has_many
ClassInfo
或 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
我有一个用户模型,我想指定为教师或学生(教师和学生是两个独立的模型),因为如果用户注册,他将有不同的注册字段,具体取决于他是教师还是学生。用户可以是老师或学生,不能同时是。
我已经尝试过了,但我认为这不是最好的方法。有帮助吗?
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
这是为您的案例实施 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 table 中(因此名称为 Single Table Inheritance),这意味着不相关字段的很多 NULL 值(比如Teacher
有一个 teacher_identification_number
,并且用户有 student_identification_number
,它们的大小不同或者他们需要不同的验证)对于属性 teacher_identification_number
将为 NULL 的所有学生,反之亦然-相反。
如果两个模型之间的字段有很大不同,那么您可以分析您的数据并将其放在不同的 table 中,只有 Teacher/Student 才能访问,这称为数据库规范化(例如 Teacher
has_many
ClassInfo
或 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