学生用とクラス用の2つのデータベースがあるとします。特定の学生にクラスを「追加」したり、特定のクラスに学生を追加したりできるようにしたいと思います。ここでは結合テーブルを使用する必要があると思いますが、それらの使用方法については少し迷っています。私は最終的に次のようなことができるようになりたいです:
@class.students.find(@student_id)
生徒がクラスにいるかどうかがわかります。クラスと生徒の関係は「has_many」であり、その逆も同様です。移行ファイルで「t.references:students」を実行すると、それが実現しますか?その行を移行ファイルに追加してから、上記のステートメントを使用して何かを見つけようとしたところ、エラーが発生しました。私はRoRを初めて使用するので、これを達成するための最良の方法が何であるかもわかりません。どんな助けでもありがたいです!
はい、これは多対多の関係です(クラスには多くの学生がいて、学生には多くのクラスがあります)。これには、has_many :through
リレーションを使用します。 ActiveRecord::Associations
のドキュメントをご覧ください(「Association Join Models」の場合はCtrl-F)。
移行では、t.references :students
は、belongs_to
列を追加するだけでstudent_id
リレーションを指定する方法です(これは、1つのID、つまり1人の学生のみを収容できます)。ただし、結合モデルにはstudent_id
とclass_id
の2つの列があります。 (ちなみに、Rubyでモデル 'Class'を呼び出すと問題が発生します。'Course 'を勧めますか?)
@ジョーダンが言ったことすべてが本当です、ここで具体的な手順を実行します:
Rails g model CourseStudent
は、n:mリレーションの結合モデルを作成し、対応するテーブルに移行します。移行ファイルCreateCourseStudent
を編集して、次の内容を含めます。
class CreateCourseStudent < ActiveRecord::Migration
def change
create_table :course_students do |t|
# Your code comes here
t.integer :student_id
t.integer :course_id
# Here comes the generated code
t.timestamps
end
end
end
移行を実行します:rake db:migrate
。その結果、結合テーブルがデータベースに存在するはずです。
モデルに次のコードを追加します
class Course < ActiveRecord::Base
has_many :course_students
has_many :students, :through => :course_students
end
class Student < ActiveRecord::Base
has_many :course_students
has_many :courses, :through => :course_students
end
class CourseStudent < ActiveRecord::Base
belongs_to :student
belongs_to :course
end
メソッドbelongs_to
およびhas_many
によって生成されたメソッドを使用できるようになりました。
@course.students
@student.courses
Rails Guides で関連するすべての事実とスニペットを見つけてみてください。そこで、軌道に乗るために必要なすべての情報が見つかります。幸運を!
これは古い質問ですが、誰かが私と同じようにこの問題に出くわした場合に備えて、関係を構築できますhas_and_belongs_to_many
。したがって、はい、結合テーブルを作成します。
create_join_table :students, :courses do |t|
t.integer :student_id
t.integer :course_id
end
そして、モデルでは、学生はhas_and_belongs_to_many :courses
そしてコースhas_and_belongs_to_many :students
。 CourseStudentという3番目のクラスを作成する必要はありません。これ link にはこのすべての情報があります