如何处理 RoR 中的三向关联?

Posted

技术标签:

【中文标题】如何处理 RoR 中的三向关联?【英文标题】:How to handle a three way associations in RoR? 【发布时间】:2019-10-19 07:39:21 【问题描述】:

我正在申请学校,其中需要讲师和学生的课程列表,学生的讲师列表和讲师的学生列表。

所以我有三个模型:员工、学生和课程。

我是 RoR 的新手,现在协会对我来说不是最有意义的,但我希望每个教职员工和学生都有多门课程。所以我想has_manybelongs_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_courseslectured_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 中的三向关联?的主要内容,如果未能解决你的问题,请参考以下文章

[译]ElasticSearch中如何处理关联数据?

[译]ElasticSearch中如何处理关联数据?

Scikit-Learn:如何处理不可排序的类型错误?

如何处理数据仓库中的图关系?

如何处理网络请求失败错误?

使用 Symfony 时如何处理连接表中的附加列?