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.
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.
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.
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:
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.
Ü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% 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
Sehen, ob es funktioniert:
%Vor%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).
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.
Tags und Links ruby-on-rails-3 ruby-on-rails activerecord ruby-on-rails-3.2