Verknüpfen von ActiveRecord :: Relationen, die durch polymorphe Assoziation abgefragt wurden

8

Meine Anwendung hat ein Jobmodell. Jeder Job im System hat contact . Dies ist wie eine Person, die Sie anrufen würden, wenn Sie eine Frage zu dem Job stellen müssen. Ein Kontakt kann entweder ein client oder ein Mitarbeiter eines Kunden ( ClientEmployee ) sein.

%Vor%

Kunden haben die Idee von commissioned_jobs . Die Aufträge, die vom Kunden in Auftrag gegeben werden, sind die Aufträge, für die der Kunde der Ansprechpartner ist ODER ein Mitarbeiter des Kunden der Ansprechpartner ist.

%Vor%

Nebenbei: Diese Methode ist ein bisschen wie ein Hack, weil sie ein Array zurückgibt und nicht ActiveRecord::Relation . Es ist auch interessant, dass es explodiert, wenn ich versuche, Jobs in employee_jobs zu contracten. Es kann oder kann nicht für meine Zwecke tun.

Ich möchte einen Bereich zu Client namens with_commissioned_jobs hinzufügen. Dies sollte alle Clients im System zurückgeben, die Jobs haben oder Mitarbeiter mit Jobs haben.

%Vor%

Wie implementiere ich diese Methode?

Ich verwende Rails 3.2.9.

Aktualisierung:

Ich habe einige Fortschritte gemacht und ich habe jetzt zwei Methoden, von denen jede die Hälfte von dem, was ich brauche, macht.

%Vor%

Jetzt muss ich nur noch diese beiden Methodenaufrufe zu einem ActiveRecord::Relation kombinieren. Ich kann das natürlich tun:

%Vor%

Das Problem ist, dass das ein Array und nicht eine Instanz von Relation zurückgibt und ich kann nicht mehr Bereiche darauf verketten.

Update 2 :

Die Verwendung von merge scheint ebenfalls nicht zu funktionieren. Hier ist die AR-Abfrage und die resultierende SQL.

%Vor%

Übrigens, hier sind die Tests, die ich versuche zu bestehen. Der erste Test schlägt fehl, da es keine Ergebnisse gibt, wenn ich die Zusammenführung verwende.

%Vor%     
David Tuite 29.11.2012, 10:58
quelle

5 Antworten

1

Haben Sie sich das Juwel meta_where angesehen? Die Hauptsache scheint zu sein, dass Sie ein Objekt ActiveRecord:Relation zur weiteren Verkettung zurückgeben wollen.

UPDATE 2 : Hat mit LEFT OUTER JOIN jobs zweimal mit Aliasing funktioniert

%Vor%

Sehen, ob es funktioniert:

%Vor%     
bitstrider 10.12.2012, 18:15
quelle
1

Versuchen Sie Folgendes:

%Vor%

Es sollte sowohl den Jobs von Kunden als auch den Jobs von Kundenmitarbeitern beitreten. Weitere Informationen finden Sie in den Leitfäden .

Bearbeiten

In Ihrem Fall können Sie Relation.merge :

verwenden %Vor%     
m_x 29.11.2012 12:38
quelle
1

Haben Sie einen wichtigen Grund, bei Polymorphie zu bleiben?

Wenn ein ClientEmployee immer einen Client hat, sollten Sie vielleicht Job.belongs_to :client haben. Das macht deine Beziehung einfach. Ich habe festgestellt, dass das Hinzufügen einiger redundanter Verknüpfungen auch zu großen Leistungsoptimierungen führen kann, solange es nicht schwieriger wird, Ihre Datensätze kohärent zu halten (dh Client / ClientEmployee-Beziehungen sind mit Job.Client / Job.ClientEmployee-Zuweisungen synchronisiert beide sind anwesend).

Ich mag Polymorphismus in Schienen sehr, aber es kann schwierig werden, wenn man versucht, sich über sie hinwegzusetzen, wie in diesem Fall. Selbst wenn Sie separate Client- und ClientEmployee-IDs hätten, wäre das in der db effizienter (zwei Eingaben im Vergleich zu int und Zeichenfolge).

    
aceofspades 11.12.2012 18:20
quelle
0

Haben Sie versucht, eine benutzerdefinierte Verknüpfung zu erstellen?

%Vor%     
Sean Hill 11.12.2012 19:17
quelle
0
%Vor%

Ok, meine andere Entscheidung von einer echten Arbeitsanwendung. Alte Schule hilft dir. :)

Diese Methode erstellt nur eine Array-Bedingung für AR: Relation für polymorphes Zeug.

%Vor%

Dann erweitere deinen polymorphen Job:

%Vor%

Rufen Sie jetzt an:

%Vor%

Viel Spaß. Wenn irgendwelche Details benötigt werden, tippe mich ein.

    
Valery Kvon 10.12.2012 22:56
quelle