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!
voici les liens, la recherche d'associations polymorphes http://api.rubyonrails.org/ classes/ActiveRecord/Associations/ClassMethods.html –
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