2011-09-30 12 views
18

学生用とクラス用の2つのデータベースがあります。特定の生徒にクラスを追加することができ、また特定のクラスに生徒を追加できるようにしたいと考えています。私はここで結合テーブルを使用する必要があると仮定しますが、私はそれらを使用する方法について少し迷っています。私は最終的に次のようなことをすることができるようになります:ruby​​ on railsでの結合テーブルの使用

@class.students.find(@student_id) 

これは、学生がクラスにいるかどうかを教えてくれます。私はクラスと学生の関係が 'has_many'であり、その逆であることを知っています。マイグレーションファイルで 't.references:students'を実行してもそれを達成できますか?その行をマイグレーションファイルに追加しようとしたところ、上のステートメントを使って何かを見つけようとしたところ、エラーが出ました。私はRoRを初めて使っているので、これを達成するための最善の方法が何であるかはわかりません。どんな助けもありがとう!

答えて

12

はい、これは多対多の関係です(クラスには多くの学生がおり、学生には多くのクラスがあります)。このためにはhas_many :throughの関係を使用します。 ActiveRecord::Associations( "Association Join Models"の場合はCtrl-F)のドキュメントを見てください。

t.references :studentsbelongs_toの関係を指定する方法です。student_id列(1人のID、つまり1人の学生しか対応できません)を追加するだけです。ただし、結合モデルには2つの列、student_idおよびclass_idがあります。 (ちなみに、Rubyでモデルのクラス」を呼び出すには、トラブルを求めている私は「コース」を提案する可能性があります。?)

+0

学生、クラス、および参加モデルのコードを投稿できますか? –

55

真すべてを@Jordanが言ったことを、ここでは具体的な手順を踏む:

  1. が作成migrationrails g model CourseStudentは、n:mリレーションの結合モデルを作成し、対応するテーブルに移行します。
  2. 編集移行ファイル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 
    
  3. 移行を実行します:rake db:migrate。その結果、データベースに結合テーブルが存在するはずです。

    • @course.students
    • @student.courses
    • モデルに次のコード

      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_tohas_manyによって生成されたメソッドを使用することができますを追加します。

Rails Guidesに関連するすべての事実とスニペットを見つけようとすると、トラックに入るために必要なすべての情報が見つかります。がんばろう!

+3

CourseStudent belongs_toはシンボルであってはなりません。 – ezis

+0

投票アップ!素晴らしい!助けて頂きました! – Askar

+0

新しいバージョンのレールでは、これをマイグレーションに使用します: 't.integer:student_id' ' t.integer:course_id' –

12

これは古い質問ですが、私がしたように誰かがこのような不具合を起こした場合には、今度は関係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にはすべてこの情報が含まれています

+7

実際には 'create_join_table'が自動的に2つのidフィールドを作成します。他のフィールド、またはインデックス用 – AlexChaffee

関連する問題