Rails5:belongs_to的和has_and_belongs_to - 相同的表2间之间的关系
问题描述:
我有以下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_many
和belongs_to
的注释时,则会考虑通过join_table的间接关系。
我如何对RAILS说一下,我想用哪个年级与学生之间的关系?
答
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 %>