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!
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"?)
tout est vrai ce que @Jordan a dit, Voici les mesures concrètes à prendre:
- 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. 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
Exécuter la migration:
rake db:migrate
. En conséquence, la table de jointure devrait maintenant exister dans votre la base de données.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!
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