2013-01-22 5 views
0

Il est une question de suivi de this.autoréférentiel association

Ceci est mon réglage actuel de faire une relation enseignant-élève.

Modèle utilisateur

has_many :teacher_links, :foreign_key => :student_id, :dependent => :destroy, :class_name => "TeacherStudentLink" 
    has_many :student_links, :foreign_key => :teacher_id, :dependent => :destroy, :class_name => "TeacherStudentLink" 
    has_many :students, :through => :student_links 
    has_many :teachers, :through => :teacher_links 

TeacherStudentLink Modèle

class TeacherStudentLink < ActiveRecord::Base 
    attr_accessible :user_id, :student_id, :teacher_id 

    belongs_to :user 
    belongs_to :student, :class_name => "User" 
    belongs_to :teacher, :class_name => "User" 
end 

Il me semble maladroit parce que la table teacher_student_links a trois colonnes: l'utilisateur, étudiant, enseignant. L'utilisateur peut avoir beaucoup d'enseignants, et il peut aussi avoir beaucoup d'étudiants. Si je n'ai pas la colonne enseignant, et que je prétends simplement que "utilisateur" est un "enseignant", tout fonctionne parfaitement. Y a-t-il un moyen de résoudre ce problème?

+1

Pourquoi ne pas vous débarrasser de la colonne 'user_id' et de l'association': user' sur le modèle 'TeacherStudentLink'? –

+0

@cheeseweasel serais-tu encore capable de faire current_user.teachers dans ce cas? –

+0

Oui sûr - chaque utilisateur aura une association «enseignants» et «étudiants». –

Répondre

1

ce cheeseweasel dit dans les commentaires, votre lien ne devrait pas avoir un user_id

class TeacherStudentLink < ActiveRecord::Base 
    attr_accessible :student_id, :teacher_id 

    belongs_to :student, :class_name => "User", :foreign_key => :student_id 
    belongs_to :teacher, :class_name => "User", :foreign_key => :teacher_id 
end 
  • belongs_to foreign_key spécifie la clé étrangère sur la table en cours (lien)
  • has_many foreign_key spécifie la clé étrangère l'autre table (lien)
+1

Excuses si je suis stupide (cela arrive plus souvent que je ne voudrais l'admettre;)), mais les rails ne déduiront-ils pas la clé étrangère du nom de l'association? –

+1

il pourrait dans ce cas - puisque votre association est nommée 'student' et qui correspondra au fk student_id; souvent quand j'ai besoin de spécifier class_name j'ai un fk qui ne correspond pas, donc j'ai pris l'habitude d'utiliser fk quand j'utilise class_name – house9