2017-05-24 83 views
0

我有以下Rails的关系模型:Rails5:belongs_to的和has_and_belongs_to - 相同的表2间之间的关系

class Grade < ApplicationRecord 
    has_and_belongs_to_many students, join_table: :grade_student_mappings 
    has_many :students 
end 

class Student < ApplicationRecord 
    has_and_belongs_to_many :grads, join_table: :grade_student_mappings 
    belongs_to :grade 
end 

现在,当我想用​​join_table访问等级表和学生表 - 轨道将失败。

例如:Grade.find_by_id(1).student将始终回答我与年级和学生之间的直接关系的内容。通过join_table的关系将被忽略。

只有当我取消对模型行has_manybelongs_to的注释时,则会考虑通过join_table的间接关系。

我如何对RAILS说一下,我想用哪个年级与学生之间的关系?

回答

0

Rails支持两种多对多关系。 has_many through和has_and_belongs_to_many。你在混合这两个。你需要选择一个,而更灵活的是has_many。你的模型文件更改为以下:

# app/models/grade_student_mapping.rb 
belongs_to :grade 
belongs_to :student 

# app/models/grade.rb 
has_many :grade_student_mappings, dependent: :destroy 

# app/models/student.rb 
has_many :grade_student_mappings, dependent: :destroy 
has_many :grades, through: :grade_student_mappings 

然后你就可以在students_controller show动作

# app/controllers/students_controller.rb 
def show 
    @grades = @student.grades 
end 

设置等级实例变量访问他们的节目模板的学生成绩的例子,显示了档次在学生的展示页面上。如下所示:

# app/views/students/show.html.erb 
<% @grades.each do |grade| %> 
    <%= grade.semester %> 
    <%= grade.course %> 
    <%= grade.letter %> 
<% end %>