Rails5:belongs_to AND has_and_belongs_to - 相同表之间的关系

时间:2017-05-24 15:29:54

标签: ruby-on-rails ruby-on-rails-5

我有以下Rails模型关系:

if((Get-Process -Name test -ErrorAction SilentlyContinue) -eq $null){
."C:\Program Files (x86)\test.exe" Start-Sleep -s 7200 Stop-Process -name test}

现在,当我想使用join_table访问成绩表和学生表时,rails将失败。

示例: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).studenthas_many时,才会考虑通过join_table的间接关系。

我怎么能对RAILS说,我想要使用哪个级别和学生之间的关系?

1 个答案:

答案 0 :(得分: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 action中设置成绩实例变量

# 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 %>