2009-08-12 6 views
0

Je les entités suivantes:Meilleure façon de modéliser l'amitié d'un utilisateur avec différentes entités?

  • utilisateur
  • Société
  • Organisation

Les utilisateurs doivent être en mesure d'ajouter des utilisateurs, entreprises, organisations et objets futurs du parti à leur liste d'amis .

Mon idée originale consistait à utiliser un objet d'amitié avec une relation polymorphes à l'ami comme ceci:

schéma d'amitié simplifié:

  • user_id
  • friendable_id
  • friendable_type
 
User 
- has_many :businesses, :through => :friendships, :conditions => ['friendable_type=?', 'Business'], :source => :friendable 

Mon problème est que Ruby on Rails ActiveRecord ne supporte pas has_many à travers les relations à travers les relations polymorphes sur la table de jointure telles.

En fin de compte je veux avoir une seule table de jointure pour pouvoir itérer pour obtenir une liste d'amis de tous types, certains types, etc. comme ci-dessous:

 
john = User.find(5) 
john.friendships.map {|friendship| friendship.friendable } 
john.businesses (has_many :through scoped to only the businesses) 
john.organizations (has_many :through scoped only to the organizations) 

J'ai pris en compte faire en sorte que l'utilisateur, l'entreprise et l'organisation héritent d'une classe générique Party et que l'association pointe vers la classe Party de base, mais dans le contexte d'un ORM qui mène à un tas de champs inutiles et qui semble sale.

Ce que je voudrais savoir comment d'autres approcheraient une telle situation, où vous voulez créer un à-plusieurs à des objets similaires à travers une table de jointure commune à l'aide ActiveRecord tout en évitant cette erreur: :)

Cannot have a has_many :through association 'User#businesses' on the polymorphic object 'Friendship#friendable'.

Tout conseil grandement apprécié.

Merci!

Répondre

0

Il semble que le plugin Rails « » has_many_polymorphs me permet de faire exactement ce que je veux.

http://github.com/fauna/has_many_polymorphs/tree/master

Ajouter cette ligne à mon modèle d'utilisateur m'a donné la fonctionnalité que je voulais:

 
has_many_polymorphs :friendables, :from => [:businesses, :organizations], :through => :friendships 
0

Ne pas utiliser: par le biais, utilisez: comme => friendable place en relation has_many polymorphes

+0

voici les liens, la recherche d'associations polymorphes http://api.rubyonrails.org/ classes/ActiveRecord/Associations/ClassMethods.html –

+0

J'ai considéré cela, mais j'ai besoin de rôles amis, ce qui signifie que j'ai besoin d'une table de jointure. – rwl4

Questions connexes