has_many: durch mehrere has_one Beziehungen?

8

Ich schreibe ein Mentorenprogramm für unsere Kirche in Schienen (ich bin noch immer neu in Schienen).

Und ich muss das modellieren ..

%Vor%

Im Grunde genommen müssen Objekte "Geschwister" alle Kinder von Vater und Mutter abbilden, ohne das Objekt selbst zu berücksichtigen.

Ist das möglich?

Danke

Daniel

    
Daniel Upton 13.02.2011, 23:08
quelle

3 Antworten

9

Es ist lustig, wie einfach erscheinende Fragen komplexe Antworten haben können. In diesem Fall ist die Implementierung der reflexiven Eltern / Kind-Beziehung ziemlich einfach, aber das Hinzufügen der Vater / Mutter- und Geschwisterbeziehungen erzeugt ein paar Wendungen.

Um zu beginnen, erstellen wir Tabellen, um die Eltern-Kind-Beziehungen zu halten. Die Beziehung hat zwei Fremdschlüssel, die beide auf Kontakt zeigen:

%Vor%

Im Beziehungsmodell zeigen wir Vater und Mutter zurück auf Kontakt:

%Vor%

und definieren Sie die inversen Assoziationen in Kontakt:

%Vor%

Jetzt kann eine Beziehung erstellt werden:

%Vor%

Das ist nicht so toll, was wir wirklich wollen, ist, die Beziehung in einem einzigen Anruf aufzubauen:

%Vor%

so können wir tun:

%Vor%

Um die untergeordneten Elemente eines Kontakts zu finden, fügen Sie dem Kontakt und (der Einfachheit halber) eine Instanzmethode hinzu:

%Vor%

Geschwister sind der schwierige Teil. Wir können die Methode Contact.children nutzen und die Ergebnisse manipulieren:

%Vor%

Dies ist nicht optimal, da sich vater.children und mother.children überlappen (also die Notwendigkeit von uniq ), und könnte effizienter erledigt werden, indem man das notwendige SQL ausarbeitet (links als Übung :)), Beachten Sie jedoch, dass sich self.father.children und self.mother.children bei Halbgeschwistern (gleicher Vater, andere Mutter) nicht überschneiden und ein Kontakt möglicherweise keinen Vater oder eine Mutter hat.

Hier sind die vollständigen Modelle und einige Spezifikationen:

%Vor%     
zetetic 14.02.2011, 09:24
quelle
2

Ich stimme zetetic völlig zu. Die Frage sieht viel einfacher aus als die Antwort und es gibt wenig, was wir dagegen tun könnten. Ich werde jedoch meine 20c hinzufügen.
Tabellen:

%Vor%

Tabellenbeziehungen haben kein entsprechendes Modell.

%Vor%

Jetzt haben wir regelmäßige Rails-Assoziationen. So können wir

%Vor%

und alles so.

    
Art Shayderov 14.02.2011 10:49
quelle
0
%Vor%

Ich habe dieses Beispiel verwendet, musste aber Folgendes hinzufügen: delete_sql, um die Beziehungsdatensätze zu bereinigen. Zuerst verwendete ich doppelte Anführungszeichen um den String, fand aber, dass Fehler verursacht wurden. Die Umstellung auf einzelne Kurse funktionierte.

    
seehad 16.03.2011 17:21
quelle