Utilisation des tables de jointure dans ruby on rails

disons que j'ai deux bases de données: une pour les étudiants et une pour les classes. J'aimerais pouvoir "ajouter" des cours à un élève en particulier et aussi pouvoir ajouter des élèves à une classe en particulier. Je suppose que je dois utiliser une table de jointure ici, mais je suis un peu perdu sur la façon de les utiliser. Je voudrais, à terme, de pouvoir faire quelque chose comme:

  @class.students.find(@student_id)

et cela me dirait si l'élève est dans la classe ou pas. Je sais que la relation entre les classes et les étudiants est 'has_many' et vice-versa. Ça ne se fait pas.références: dans les fichiers migrate, les élèves réalisent-ils cela? J'ai essayé d'ajouter cette ligne à mon fichier migrate et ensuite essayé de trouver quelque chose en utilisant la déclaration ci-dessus et cela m'a donné une erreur. Je suis nouveau à RoR, donc je ne suis même pas sûr de ce que le meilleur moyen d'y parvenir est. Toute aide est appréciée!

21
demandé sur Brian Tompsett - 汤莱恩 2011-09-30 08:58:55

3 réponses

Oui, c'est une relation de plusieurs à plusieurs (la classe a beaucoup d'élèves, l'élève a beaucoup de classes). Pour cela, vous allez utiliser un has_many :through relation. Jetez un oeil à la doc de ActiveRecord::Associations (Ctrl-F pour "Association Join Models").

Dans une migration, t.references :students est la façon dont vous spécifiez un belongs_to relation, il ajoute juste un student_id colonne (qui ne peut accueillir qu'une seule carte d'identité, c.-à-d. Un élève). Une jointure modèle, cependant, aura deux colonnes: student_id et class_id. (Ailleurs, appeler un mannequin 'classe' à Ruby, c'est chercher les ennuis. Puis-je suggérer "cours"?)

13
répondu Jordan Running 2011-09-30 05:12:02

tout est vrai ce que @Jordan a dit, Voici les mesures concrètes à prendre:

  1. Créer un migration:rails g model CourseStudent crée un modèle de jointure pour la relation n:m, et la migration vers la table correspondante.
  2. Modifier le fichier de migration CreateCourseStudent donc il contient les éléments suivants:

    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. Exécuter la migration: rake db:migrate. En conséquence, la table de jointure devrait maintenant exister dans votre la base de données.

  4. Ajouter aux modèles le code suivant

    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
    

vous pouvez maintenant utiliser les méthodes générées par les méthodes belongs_to et has_many:

  • @course.students
  • @student.courses

Essayez de trouver tous les faits pertinents et les extraits de code dans le Rails Guides, vous devriez y trouver toutes les informations dont vous avez besoin pour obtenir sur la bonne voie. Bonne chance!

58
répondu mliebelt 2016-08-20 15:54:57

C'est une vieille question, mais juste au cas où quelqu'un tombe sur cette comme je l'ai fait, vous pouvez maintenant avoir les relations has_and_belongs_to_many. Donc, oui, vous pouvez créer une table de jointure:

create_join_table :students, :courses do |t|
  t.integer :student_id
  t.integer :course_id
end

et puis dans les modèles, vous diriez qu'un étudiant has_and_belongs_to_many :courses Et un cours has_and_belongs_to_many :students. Il n'est pas nécessaire de faire une troisième classe appelée CourseStudent. Ce lien a toutes ces informations

13
répondu StephanieS 2016-10-08 23:14:25