web-dev-qa-db-ja.com

Ruby on rails

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

  @class.students.find(@student_id)

生徒がクラスにいるかどうかがわかります。クラスと生徒の関係は「has_many」であり、その逆も同様です。移行ファイルで「t.references:students」を実行すると、それが実現しますか?その行を移行ファイルに追加してから、上記のステートメントを使用して何かを見つけようとしたところ、エラーが発生しました。私はRoRを初めて使用するので、これを達成するための最良の方法が何であるかもわかりません。どんな助けでもありがたいです!

23
user972276

はい、これは多対多の関係です(クラスには多くの学生がいて、学生には多くのクラスがあります)。これには、has_many :throughリレーションを使用します。 ActiveRecord::Associations のドキュメントをご覧ください(「Association Join Models」の場合はCtrl-F)。

移行では、t.references :studentsは、belongs_to列を追加するだけでstudent_idリレーションを指定する方法です(これは、1つのID、つまり1人の学生のみを収容できます)。ただし、結合モデルにはstudent_idclass_idの2つの列があります。 (ちなみに、Rubyでモデル 'Class'を呼び出すと問題が発生します。'Course 'を勧めますか?)

14
Jordan Running

@ジョーダンが言ったことすべてが本当です、ここで具体的な手順を実行します:

  1. migration を作成します。Rails 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。その結果、結合テーブルがデータベースに存在するはずです。

  4. モデルに次のコードを追加します

    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 で関連するすべての事実とスニペットを見つけてみてください。そこで、軌道に乗るために必要なすべての情報が見つかります。幸運を!

68
mliebelt

これは古い質問ですが、誰かが私と同じようにこの問題に出くわした場合に備えて、関係を構築できます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 にはこのすべての情報があります

17
StephanieS