27 Stimmen

HABTM Polymorphe Beziehung

Ich bin ziemlich neu in Rails, und ich versuche, eine polymorphe HABTM-Beziehung zu tun. Das Problem ist, dass ich drei Modelle habe, die ich in Beziehung setzen möchte.

Das erste ist das Ereignismodell und dann gibt es zwei Arten von Teilnehmern: Benutzer und Kontakte.

Ich möchte in der Lage sein, als Teilnehmer sowohl mit Nutzern als auch mit Kontakten in Kontakt zu treten. Also, was ich im Moment in meinem Code habe ist:

Ereignis-Modell

has_and_belongs_to_many :attendees, :polymorphic => true

Benutzer-Modell

has_and_belongs_to_many :events, :as => :attendees

Kontakt Modell

has_and_belongs_to_may :events, :as => :attendees
  1. Wie muss die Migration der HABTM-Tabelle aussehen? Ich bin ein wenig verwirrt und habe keine Hilfe dazu gefunden.
  2. Wird es funktionieren?

65voto

Maurício Linhares Punkte 38957

Nein, das geht nicht, es gibt keine polymorphe has_and_belongs_to_many Assoziation.

Was Sie tun können, ist, ein mittleres Modell zu erstellen. Es würde wahrscheinlich in etwa so aussehen:

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

Auf diese Weise verhält sich das Abonnementmodell wie die Verknüpfungstabelle in einer N:N-Beziehung, ermöglicht aber ein polymorphes Verhalten für das Ereignis.

0voto

ChuckE Punkte 5270

Resolveu parcialmente.

Mit dem uns zur Verfügung stehenden Rahmen lässt sich das Problem zwar lösen, aber es fügt "unnötige" Komplexität und Code hinzu. Durch die Erstellung eines Zwischenmodells (das ich B nennen werde) und angesichts der Tatsache, dass A -> B -> C "A hat_viele B's, die_viele C's haben" ist, haben wir ein weiteres AR-Modell, das eine weitere AR-Klassenimplementierung in den Speicher lädt, sobald es geladen ist, und das nur zu dem Zweck instanziiert wird, C-Instanzen zu erreichen. Man kann immer sagen, wenn man die :through-Assoziation verwendet, lädt man die B-Assoziation nicht, aber dann hat man ein noch veralteteres Modell, das nur dazu da ist, die Karawane vorbeiziehen zu sehen.

Tatsächlich könnte dies eine Funktion sein, die in Active Record fehlt. Ich würde vorschlagen, diese Funktion hinzuzufügen, da sie mir selbst Sorgen bereitet (so bin ich in der Hoffnung, eine Lösung zu finden, in diesem Beitrag gelandet :) ).

Kumprimentos

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X