2009-02-23 7 views
1

J'ai une application Rails que je suis en train de concevoir. J'ai un modèle séparé qui doit être lié à seulement 2 d'un modèle. Plus précisément, mes «évaluations» ont deux «membres», un évaluateur et un évaluateur. Ils ont aussi quelques autres informations, mais elles ne devraient pas être pertinentes pour cela.Passer de 2 à plusieurs dans Rails

Quelle est la meilleure façon de représenter cela? Est-ce que 2 clés étrangères dans l'évaluation seraient les meilleures, ou une relation multiple entre les évaluations et les membres? Y aurait-il une autre option qui fonctionnerait encore mieux?

Je penserais d'abord beaucoup à beaucoup, mais comme il y a un nombre défini d'un côté de la relation, je doute de l'applicabilité ici. À ma connaissance, plusieurs-à-plusieurs implique généralement que le nombre de chaque côté de la relation est variable.

Répondre

1

Vous voulez probablement deux associations différentes, peut-être avec la même classe:

class Member < ActiveRecord::Base 
    has_many :evaluations_out, :class_name => 'evaluation', :as => :evaluator 
    has_many :evaluations_in, :class_name => 'evaluation', :as => :evaluatee 
end 

class Evaluation < ActiveRecord::Base 
    belongs_to :evaluator, :class_name => 'member' 
    belongs_to :evaluatee, :class_name => 'member' 
end 
+0

+1 convenu. Si le système est tel qu'il y aura toujours 2 relations, 2 FK sont les meilleurs. S'il peut y avoir un futur cas d'utilisation probable où vous pouvez avoir plus de 2, c'est quand vous devriez probablement utiliser un nombre de plusieurs. – DanSingerman

+0

Et dans le cas où il y a un nombre arbitraire, mais chaque relation a un type (évaluateur/évalué), alors vous voulez probablement un modèle intermédiaire. Donc, il devient trois modèles - deux avec un 1: n et un 1: n-through, et un modèle avec deux 1: ns. –

+0

La solution de Javier ci-dessous fait un bon point: ceux-ci: les noms de classe doivent être en majuscules. Les: foreign_keys sont redondants s'ils sont identiques au premier argument de belongs_to (le nom de l'association). –

0

Je ne l'ai pas testé moi-même et il peut paraître un peu aventureux, mais je pense que cela pourrait fonctionner:

Modèle d'évaluation

class Evaluation < ActiveRecord::Base 
    belongs_to :evaluator, :class_name => "Member", :foreign_key => "evaluator_id" 
    belongs_to :evaluatee, :class_name => "Member", :foreign_key => "evaluatee_id" 

end 

Modèle membre

class Member < ActiveRecord::Base 
    has_many :evaluators, :class_name => "Evaluation", :foreign_key => "evaluator_id" 
    has_many :evaluatees, :class_name => "Evaluation", :foreign_key => "evaluatee_id" 

end 
Questions connexes