Frage

Hey alle, ich habe etwas von einer interessanten Voraussetzung für mein Projekt. Ich brauche eine has_one Beziehung, wo es entweder eine Klasse oder die anderen, aber ohne Vererbung. Ich konnte mit Vererbung weg, wenn es der einzige Weg ist, aber die beiden Gesellschafter Datensätze haben völlig unterschiedliche Daten und sind nicht verwandt.

Was ich brauche ist, um herauszufinden, etwas wie folgt aus.

# 1. Foo never belongs to anything.
# 2. Foo MUST have one assigned sub-record for validity.
# 3. Foo can only have either Bar or Baz assigned.
# 4. Bar and Baz have only ONE common property, and aren't
#    related in either data or implementation.

class Foo < ActiveRecord::Base
  # Attributes: id, name, value
  has_one :assignment, :foreign_key => 'assigned_to', :readonly => true
          # Could really use an :object_type for has_one here...
end

class Bar < ActiveRecord::Base
  # Attributes: name,...
end

class Baz < ActiveRecord::Base
  # Attributes: name,...
end

Wo Foo eine Zuordnung hat, vom Typ entweder Bar oder Baz; sie nur eine gemeinsame Spalte teilen, so kann ich vielleicht ein übergeordnetes Objekt aus, dass machen. Allerdings, wenn ich sie von einem gemeinsamen Objekt erben machen (wenn die Daten, die sie wirklich enthalten ist Orangen und Äpfel) muss ich einen Tisch für den Datensatz zu machen? Kann ich vielleicht weg mit ihm, wenn der Datensatz eine abstrakte Aufzeichnung, aber die Kinder nicht?

Ich nehme jetzt Sie meine Schwierigkeiten sehen können. Ich bin ziemlich neu zu RoR aber es bisher zu lieben. Ich bin sicher, es gibt einen Weg, um dieses, aber ich werde gestopft werden, wenn ich kann nicht herausfinden, was es ist.

War es hilfreich?

Lösung

Sie versuchen, etwas zu modellieren, die nicht das relationale Datenbank Paradigma passen. Alle Verweise in SQL haben einen Ursprung und ein Ziel.

FWIW, Polymorphe Verbände ist auch ein Anti-Muster, weil es diese Regel bricht. Es sollte ein Hinweis sein, dass es ein gebrochenes Design, wenn die Dokumentation sagt, dass Sie eine referenziellen Integrität verzichten müssen, damit es funktioniert!

Sie müssen Foo zwei has_one Beziehungen haben : eine nach Bar und ein bis Baz. Dann implementieren Logik etwas Klasse zu versuchen nur, um sicherzustellen, eine Referenz in jedem Fall von Foo bevölkert ist. Das heißt, der Verweise auf Bar und Baz, man muss einen Wert haben und der andere muss null sein, aber das ist etwas für Ihren Code zu überprüfen und durchzusetzen.

Andere Tipps

Vielleicht ein Weg, dies zu tun, ist zu hat-eine Vereinigung in Foo zu schaffen, für die Bar und Baz. Dann erstellen Sie eine Methode namens Zuordnung und Zuweisung = das die einzige Art und Weise sein kann, Bar und Baz zuzugreifen. Sie können, welche der beiden has_ones überprüfen in der get-Methode nicht gleich Null ist und dass man zurück. In den Zuweisungsverfahren, können Sie überprüfen, was der Typ der Variablen in und eingestellt geben wird, ist die korrekte hat-Eins-Beziehung zu diesem Objekt und stellen Sie die andere auf Null. Das sollte alle Grundlagen abzudecken, ohne zu kompliziert zu sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top