references rails inverse_of has_many has_and_belongs_to_many foreign belong association ruby-on-rails-3 activerecord polymorphism relationship has-many-polymorphs

ruby-on-rails-3 - inverse_of - rails references



Relación polimórfica HABTM (2)

Soy bastante nuevo en Rails, y estoy tratando de hacer una relación HABTM polimórfica. El problema es que tengo tres modelos que quiero relacionar.

El primero es el modelo de evento y luego hay dos tipos de asistentes: usuarios y contactos.

Lo que quiero hacer es poder relacionar como asistente a los usuarios y contactos. Entonces, lo que tengo ahora en mi código es:

Modelo de evento

has_and_belongs_to_many :attendees, :polymorphic => true

Modelo de usuario

has_and_belongs_to_many :events, :as => :attendees

Modelo de contacto

has_and_belongs_to_may :events, :as => :attendees

  1. ¿Cómo debe ser la migración de la tabla HABTM? Estoy un poco confundido y no he encontrado ayuda en eso.
  2. ¿Va a funcionar?

No, no puedes hacer eso, no existe una asociación polimórfica has_and_belongs_to_many.

Lo que puedes hacer es crear un modelo intermedio. Probablemente sería algo como esto:

class Subscription < ActiveRecord::Base belongs_to :attendee, :polymorphic => true belongs_to :event end class Event < ActiveRecord::Base has_many :subscriptions end class User < ActiveRecord::Base has_many :subscriptions, :as => :attendee has_many :events, :through => :subscriptions end class Contact < ActiveRecord::Base has_many :subscriptions, :as => :attendee has_many :events, :through => :subscriptions end

De esta forma, el modelo de suscripción se comporta como la tabla de enlaces en una relación N: N, pero le permite tener el comportamiento polimórfico del evento.


Resolveu parcialmente.

Resuelve el problema dado el marco que tenemos a nuestra disposición, pero agrega complejidad y código "innecesarios". Al crear un modelo intermediario (que llamaré B), y dado que A -> B -> C es "A tiene_muchos B que tienen muchas C", tenemos otro Modelo AR que cargará una implementación más de la clase AR en la memoria una vez que sea cargado, y instanciará con el único propósito de llegar a instancias de C. Siempre puedes decir que si usas la asociación: a través de asociación, no cargas la asociación B, pero entonces te quedará un modelo aún más obsoleto, que solo estará allí para ver pasar la caravana.

De hecho, esta podría ser una característica que falta en Active Record. Lo propondría como una función para agregar, ya que ha sido motivo de preocupación para mí (así es como llegué a este post con la esperanza de encontrar una solución :)).

Cumprimentos