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!

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top