如何关联3种“多通”关系?

时间:2018-06-21 21:07:58

标签: ruby-on-rails model associations has-many-through model-associations

所以我有3个模型。 EducationBoard,等级和科目。EducationBoard可以具有许多/不同的等级,并且等级将属于许多课程。现在与年级和主题相同。一个年级可以有多个科目,并且可以属于多个年级。所以我做到了。

class EducationBoard < ApplicationRecord
  has_many :education_board_grades
  has_many :grades, -> {includes :subjects}, through: :education_board_grades, dependent: :delete_all
end

class Grade < ApplicationRecord
  has_many :education_board_grades, dependent: :destroy
  has_many :education_boards, :through => :education_board_grades, dependent: :delete_all

  has_many :grade_subjects
  has_many :subjects, :through => :grade_subjects, dependent: :delete_all
end

class Subject < ApplicationRecord
  has_many :grade_subjects
  has_many :grades, :through => :grade_subjects, dependent: :delete_all
end

现在,我可以将板与等级关联,并将等级与主题关联。但是,我无法获得属于特定委员会的特定年级的学科。

即如果我想为EducationBoard StateBoard的一年级所有科目

EducationBoard.find_by_name('StateBoard').grades.find_by_name('1').subjects 将返回所有与1年级相关且显然不是董事会特定的主题。因为它只是从grade_subjects关联表中查询grade_idsubject_id外键。

现在要进行快速修复(我没有时间),我被迫将一个education_board_id异物放入grade_subjects表中。但是Rails关联仅考虑2个外键(grade_idsubject_id),而忽略了我添加的board_id。因此,我最终手动运行了一个匹配3个外键条件的查询。

subject_ids = GradeSubject.where(grade_id: grade_id, education_board_id: education_board_id).pluck(:subject_id)
@subjects = Subject.where(:id => subject_ids).select(:id, :subject)

我应该如何对此进行映射,以便可以访问EducationBoard的->一年级的->主题

感谢您的帮助。谢谢。

我记得尝试创建一个education_board_subjects关联,但是由于它无法使映射正常工作,因此无法正常工作。这是要走的路吗?不知道我在做什么错,所以我被迫在grade_subjects关联表中输入board_id外键

0 个答案:

没有答案