Gegenseitig referenzierte Modelle

Hallo zusammen!

Ich ueberlege gerade eine Datenmodellierung, und wie ich sie abspeichern
kann. Ein einfaches Beispiel, ein “Kontakt” hat beliebig viele
“Adressen”,
eine davon ist die Hauptadresse.

Was ich jetzt gerne machen wuerde, waere ein “has_many :addresses”,
sowie ein “belongs_to :address” fuer die Haupt-Adresse. Im Address-Model
wiederum gibt’s einfach das “belongs_to :kontakt”.

Jetzt ist es natuerlich schwer, dabei die Datenbank-Constraints da zu
haben, um beide Daten gleichzeitig einzutragen, waehrend sie ja noch gar
keine IDs haben.
Wenn ich das einfach so mache, und versuche, eins der Modelle
abzuspeichern, versucht er zuerst das andere abzuspeichern, welcher
wieder das andere speichern moechte. Letztlich bekomme ich ein
“SystemStackError: stack level too deep” (Ich hab erstmal sqlite
verwendet, kann Rails das ggf. mit einer anderen Datenbank?).

Ich fuerchte, sowas nennt man warscheinlich schlechtes Datenmodell, aber
von den Relationen ist es genau das, was ich mir so vorstelle.

Gibt’s irgendeine saubere sichere Loesung, wie man sowas doch machen
kann?

Gruesse, Rainer

Hallo Rainer,

Ich ueberlege gerade eine Datenmodellierung, und wie ich sie
abspeichern
kann. Ein einfaches Beispiel, ein “Kontakt” hat beliebig viele
“Adressen”, eine davon ist die Hauptadresse.

keine Ahnung, ob das die beste Lösung ist,
aber ich habe es bei mir so gelöst:
Du erweiterst Deine Adressklasse um den Bool “mainaddress”
Wenn eine Adresse nun die Hauptadresse sein soll, setzt Du das
auf true.

Und jetzt:

Class Address
belongs_to :contact

Class Contact
has_many :addresses
has_one :mainaddress, :class_name=>“Address”,
:conditions => 'addresses.mainaddress=true"

Du speicherst also viele Adressen und jetzt bei einer mainaddress auf
true (sinnigerweise noch einen Constraint, dass es nur eine mainaddress
geben darf…).
Simple as that. Funktioniert bei mir recht gut.

gruß
Sven

klingt das nicht nach einer single table inheritance mit einem type
feld “MainAddress” oder “SubAddress”
oder hab ich was übersehen?

Hallo, Sven!

Ich ueberlege gerade eine Datenmodellierung, und wie ich sie
abspeichern kann. Ein einfaches Beispiel, ein “Kontakt” hat
beliebig viele “Adressen”, eine davon ist die Hauptadresse.
Du erweiterst Deine Adressklasse um den Bool “mainaddress”
Wenn eine Adresse nun die Hauptadresse sein soll, setzt Du das
auf true.

Das ist natuerlich eine Loesung, allerdings gibt es keine echten
Constraints, dass es genau eine Hauptadresse geben muss.

[…] (sinnigerweise noch einen Constraint, dass es nur eine mainaddress
geben darf…).

Wie funktioniert das?

Gruesse, Rainer

Hallo Rainer,

Rainer Jung schrieb:

Das ist natuerlich eine Loesung, allerdings gibt es keine echten
Constraints, dass es genau eine Hauptadresse geben muss.

Setz doch einfach in before_save eine Abfrage, in der Du eine evtl.
vorhandene Hauptadresse einfach löschst, falls der zu speichernde
Datensatz die neue Hauptadresse wird (sprich, die alte Hauptadresse
in eine normale Adresse umwandelst).

gruß
Sven

Sers, Sascha!

Ich ueberlege gerade eine Datenmodellierung, und wie ich sie
abspeichern kann. Ein einfaches Beispiel, ein “Kontakt” hat
beliebig viele “Adressen”, eine davon ist die Hauptadresse.
[…] (sinnigerweise noch einen Constraint, dass es nur eine mainaddress
geben darf…).
Wie funktioniert das?
klingt das nicht nach einer single table inheritance mit einem type
feld “MainAddress” oder “SubAddress”
oder hab ich was übersehen?

Wenn ich STI verwende, habe ich auch kein Constraint, dass es genau eine
Haupt-Adresse gibt.

Gruesse, Rainer

Hallo Rainer,

Am 27.12.2007 um 07:21 schrieb Rainer Jung:

feld “MainAddress” oder “SubAddress”
oder hab ich was übersehen?

Wenn ich STI verwende, habe ich auch kein Constraint, dass es genau
eine
Haupt-Adresse gibt.

Für die Hauptadresse kannst du doch eine has_one machen und für die
Anderen eine has_many auf deine STI.

Herzliche
Grüße,Michael

Gruesse, Rainer


rubyonrails-ug mailing list
[email protected]
http://mailman.headflash.com/mailman/listinfo/rubyonrails-ug


Michael V.
Framheinstr. 1
22083 Hamburg

Phone: 0177 6 77 0129
E-Mail: [email protected]

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs