La meilleure façon de modéliser « l'amitié » d'un utilisateur avec les différentes entités?

StackOverflow https://stackoverflow.com/questions/1268120

Question

Je les entités suivantes:

  • Utilisateur
  • Entreprise
  • 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 par des relations par le biais de relations polymorphes sur la table de jointure tel.

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)

Je l'ai envisagé de faire l'utilisateur, affaires et organisation hérite d'une classe de Parti générique et faisant le point d'association à la classe Parti de base, mais dans le contexte d'un ORM qui conduit à un tas de champs junk et juste 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 commune jointure à l'aide ActiveRecord tout en évitant cette erreur::)

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

Un conseil très apprécié.

Merci!

Était-ce utile?

La solution 2

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

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

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

Autres conseils

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top