2010-05-20 7 views
4

J'ai la configuration suivante:Comment faire plusieurs has_and_belongs_to_many associations entre les deux mêmes classes?

class Publication < ActiveRecord::Base 
    has_and_belongs_to_many :authors, :class_name=>'Person', :join_table => 'authors_publications' 
    has_and_belongs_to_many :editors, :class_name=>'Person', :join_table => 'editors_publications' 
end 

class Person < ActiveRecord::Base 
    has_and_belongs_to_many :publications 
end 

Avec cette configuration, je peux faire des choses comme Publication.first.authors. Mais si je veux lister toutes les publications dans lesquelles une personne est impliquée Person.first.publications, une erreur sur une table de jointure manquante people_publications a été levée. Comment pourrais-je résoudre ce problème? Est-ce que je devrais peut-être passer à des modèles séparés pour les auteurs et les éditeurs? Cela introduirait cependant une certaine redondance dans la base de données, puisqu'une personne peut être l'auteur d'une publication et l'éditeur d'une autre publication.

Répondre

3

L'autre extrémité de vos associations devrait probablement être appelée quelque chose comme authored_publications et edited_publications avec un accesseur supplémentaire en lecture seule publications qui renvoie l'union des deux.

Sinon, vous tomberez pour collant des situations si vous essayez de faire des choses comme

person.publications << Publication.new 

parce que vous ne saurez jamais si la personne était un auteur ou un éditeur. Non que cela ne puisse pas être résolu différemment en changeant légèrement votre modèle d'objet.

Il y a aussi des hacks que vous pouvez faire dans ActiveRecord pour changer les requêtes SQL ou changer le comportement de l'association, mais peut-être simplement garder les choses simples?

+1

has_and_belongs_to_many: authored_publications,: class_name => "Publication",: join_table =>: authors_publications –

+0

has_and_belongs_to_many: edited_publications,: class_name => "Publication" ,: join_table =>: editors_publications –

0

Je crois que vous devriez avoir une autre association sur person modèle

class Person < ActiveRecord::Base 
    # I'm assuming you're using this names for your foreign keys 
    has_and_belongs_to_many :author_publications, :foreign_key => :author_id 
    has_and_belongs_to_many :editor_publications, :foreign_key => :editor_id 
end 
Questions connexes