如何处理 RoR 中的三向关联?
Posted
技术标签:
【中文标题】如何处理 RoR 中的三向关联?【英文标题】:How to handle a three way associations in RoR? 【发布时间】:2019-10-19 07:39:21 【问题描述】:我正在申请学校,其中需要讲师和学生的课程列表,学生的讲师列表和讲师的学生列表。
所以我有三个模型:员工、学生和课程。
我是 RoR 的新手,现在协会对我来说不是最有意义的,但我希望每个教职员工和学生都有多门课程。所以我想has_many
和belongs_to
。然后我希望每个学生都有他/她的讲师名单,所以has_many :staff, through: :course
和员工has_many :student, through: :course
相同。我还想为关系使用一个特定的列,比如 course_code
而不是 id。
员工.rb
has_many :courses
has_many :students, through: :courses
学生.rb
has_many :courses
has_many :staff, through: :courses
课程.rb
belongs_to :staff
belongs_to :students
如果我想能够做到@student.course.all
和@student.lecturer.all
,这是最好的方法吗?
【问题讨论】:
一门课程可以有多位讲师吗? 考虑创建另一个模型作为 M:M 关系之间的桥梁(类似于Enrollment
,而不是 Course)。 Course
应该只包含有关课程的内容(如您所述,course_code
之类的内容)。
是的,还有多名学生。
@MarkMerritt 我想到了,我最初创建了 2 个表,Students_Courses 和 Staff_Courses,但我不知道如何从那里继续前进。
@BeulahAkindele 这对我来说似乎是一个合理的解决方案。从那里它只是构建查询以获取数据的问题。
【参考方案1】:
如果您希望学生和讲师都有课程,则需要使用多态关联。
https://guides.rubyonrails.org/association_basics.html#polymorphic-associations 这是一个指南,告诉您如何实施!
编辑:您不需要使用多态关联,但它会帮助您的代码变干。此外,使用关注点!
编辑:另外,我认为您需要一个连接表。 (一个课程可以有很多学生,一个学生可以有很多课程)。
【讨论】:
【参考方案2】:因此,一个学生可以学习许多课程,教职员工可以教授许多课程,一个课程由 1 个或多个学生学习,并且由 1 个或多个教职员工教授。阅读本文:您需要一个连接表。
仍然像往常一样,有许多不同的方法可以做到这一点。让我先从最简单的开始:创建两个连接表:followed_courses
和 lectured_courses
。
Class FollowedCourse
belongs_to :student
belongs_to :course
Class LecturedCourse
belongs_to :lecturer
belongs_to :course
Class Course
has_many :followed_courses
has_many :students, through: :followed_courses
has_many :lectured_courses
has_many :lecturers, through: :lectured_courses
Class Lecturer
has_many :lectured_courses
has_many :courses, through: :lectured_courses
Class Student
has_many :followed_courses
has_many :courses, through: :followed_courses
(“工作人员”在 ruby on rails 中是一个令人困惑的词,因为它没有复数:你如何表示团队操作人员与单个工作人员,这就是我在这里建议 lecturer
的原因,但当然你可以使用老师或类似的东西)。
我可以想象的是一个人,有时扮演学生的角色,有时扮演老师的角色,所以你可以有一个不同的连接表,称为ParticipatingCourses
,它属于一个人和一门课程,并有一个角色表明他们以何种方式参与:学生或讲师。这让事情变得有点困难,所以我认为现在坚持我的第一个提案会更简单。
【讨论】:
以上是关于如何处理 RoR 中的三向关联?的主要内容,如果未能解决你的问题,请参考以下文章