La mejor manera de modelar “amistad” de un usuario con diferentes entidades?
-
13-09-2019 - |
Pregunta
Tengo las siguientes entidades:
- User
- Compañía
- Organización
Los usuarios deben ser capaces de añadir usuarios, empresas, organizaciones, y las partes se opone futuras a su lista de amigos.
Mi idea original implicó el uso de un objeto con una relación de amistad polimórfica al amigo de este modo:
simplificado esquema de amistad:
- user_id
- friendable_id
- friendable_type
User - has_many :businesses, :through => :friendships, :conditions => ['friendable_type=?', 'Business'], :source => :friendable
Mi problema es que Ruby on Rails ActiveRecord no soporta has_many través de relaciones a través de las relaciones polimórficas en la tabla de unión tales.
Al final quiero tener una sola tabla de unión para poder recorrer para obtener una lista de amigos de todo tipo, algunos tipos, etc., como a continuación:
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)
He pensado en hacer el usuario, de negocios, y Organización heredar de una clase genérica del partido y hacer que el punto de asociación a la clase Partido base, pero en el contexto de un ORM que lleva a un montón de campos de chatarra y sólo parece sucio.
Lo que me gustaría saber es cómo los demás se acercarían a una situación como esta en la que desea crear relaciones uno-a-muchos objetos similares a través de una tabla de unión común el uso de ActiveRecord y evitar este error::)
Cannot have a has_many :through association 'User#businesses' on the polymorphic object 'Friendship#friendable'.
Cualquier consejo muy apreciada.
Gracias!
Solución 2
Parece que los rieles Plugin 'has_many_polymorphs' me permite hacer exactamente lo que quiero.
http://github.com/fauna/has_many_polymorphs/tree/master
La adición de esta línea para mi modelo de usuario me dio la funcionalidad que quería:
has_many_polymorphs :friendables, :from => [:businesses, :organizations], :through => :friendships
Otros consejos
No utilice: a través de, el uso: como => friendable lugar en relación has_many polimórfica