2 つのテーブル間の双方向の関係をレールします
概要
Ruby on Rails では、2 つのテーブル間に双方向の多対多の関係を作成できるようにしようとしています。ルートとコントローラーの関係が必要です。たとえば、以下の両方を実行できるようにしたいと考えています。
教師 = school_class.Teachers.all school_classes = Teacher.school_classes.all したがって、この問題のルーティング設定、コントローラー、モデルについて手伝っていただければ幸いです。
has_and_belongs_to_many 関連付けを使用してみました。それが正しい方法だと思いますが、他に何もわかりませんでした。
解決策
2 つのテーブル間に多対多のリレーションシップがある場合、必然的にそれらの間にリレーションシップ テーブルが必要になります。
したがって、最初に関係テーブルを作成するモデルを作成します。
rails g model TeacherSchoolClass teacher:reference school_class:reference
次に、models/Teacher_school_class.rb に、belongs_to 行を追加します。
class TeacherSchoolClass < ApplicationRecord
belongs_to :teacher
belongs_to :school_class
end
最後に、models/Teacher.rb と models/school_class.rb の両方に、 has_many/through 行を追加します。
class Teacher < ApplicationRecord
has_many :teacher_school_classes, dependent: :destroy # Will destroy the related teacher_school_classes when teacher is destroyed
has_many :school_classes, through: :teacher_school_classes # Will get all the school_classes for this teacher through the teacher_school_classes table
end
class SchoolClass < ApplicationRecord
has_many :teacher_school_classes, dependent: :destroy # Will destroy the related teacher_school_classes when school_class is destroyed
has_many :teachers, through: :teacher_school_classes # Will get all the teachers for this school_class through the teacher_school_classes table
end
その後、以下を取得できるようになります。
teacher.school_classes # Returns an ActiveRecord::Relation of SchoolClass
school_class.teachers # Returns an ActiveRecord::Relation of Teacher
参考:https://guides.rubyonrails.org/association_basics.html#the-has-many-through-association