2017-05-24 64 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 %>