Relazione polimorfica HABTM

Sono piuttosto nuovo di Rails e sto provando a fare una relazione HABTM polimorfa. Il problema è che ho tre modelli che voglio mettere in relazione.

Il primo è il modello di evento e quindi sono due tipi di partecipanti: utenti e contatti.

Quello che voglio fare è essere in grado di mettere in relazione come partecipanti sia gli utenti che i contatti. Quindi, quello che ho adesso nel mio codice è:

Modello di evento

has_and_belongs_to_many :attendees, :polymorphic => true 

Modello utente

 has_and_belongs_to_many :events, :as => :attendees 

Modello di contatto

 has_and_belongs_to_may :events, :as => :attendees 
  1. Come deve essere la migrazione della tabella HABTM? Sono un po ‘confuso e non ho trovato alcun aiuto su questo.
  2. Funzionerà?

No, non puoi farlo, non esiste una associazione polimorfica has_and_belongs_to_many.

Quello che puoi fare è creare un modello intermedio. Probabilmente sarebbe qualcosa del genere:

 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 

In questo modo il modello di sottoscrizione si comporta come la tabella di collegamento in una relazione N: N ma consente di avere il comportamento polimorfico all’evento.

Resolveu parcialmente.

Risolve il problema data la struttura che abbiamo a nostra disposizione, ma aggiunge complessità e codice “inutili”. Creando un modello intermedio (che chiamerò B) e assegnando A -> B -> C come “A has_many B’s with_many C”, abbiamo un altro modello AR che caricherà un’altra implementazione di class AR in memoria una volta che è caricato e istanziato per il solo scopo di raggiungere istanze C. Puoi sempre dire, se usi l’associazione: through, non carichi l’associazione B, ma ti verrà lasciato un modello ancora più obsoleto, che sarà lì solo per vedere passare la carovana.

In realtà, questa potrebbe essere una caratteristica mancante da Active Record. Lo proporrei come caratteristica da aggiungere, poiché è stato motivo di preoccupazione per me stesso (è così che sono atterrato in questo post sperando di trovare una soluzione :)).

Cumprimentos