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
- ¿Cómo debe ser la migración de la tabla HABTM? Estoy un poco confundido y no he encontrado ayuda en eso.
- ¿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