2017-02-02 2 views
0

Meine app ein Child schema/Modell haben, das viele im Zusammenhang ChildAttendance Aufzeichnungen hat.Ecto Abfrage - Preload ein assoziiertes Objekt für eine Reihe von Aufzeichnungen

ich ziemlich leicht kann die gesamten child_attendances für ein bestimmtes Kind Vorspannung:

from ch in Child, preload: [:child_attendances]

Was Ich mag würde, ist nur der letzte Zuschauerrekord für ein bestimmtes Kind Vorspannung zu tun, oder Reihe von Kindern.

habe ich versucht, die folgenden:

def with_last_attendance(query \\ Child) do 
    last_attendance = from att in ChildAttendance, 
          order_by: [desc: att.in_at], 
          limit: 1 
    from query, preload: [last_attendance: ^last_attendance] 
    end 

Die oben genannten Arbeiten, aber nur, wenn die übergeordnete Abfrage ein einzelnes Kind zurückkehrt (das heißt die limit: 1 wird die Anzahl der Anwesenheitslisten Begrenzung insgesamt zurückgeschickt werden).

Zum Beispiel

Repo.one!(Child |> where([ch], ch.id == ^child_id) |> with_last_attendance) 

funktioniert wie erwartet, mit dem Kind Rekord ein einzigenChildAttendance Datensatz geladen in die last_attendance Vereinigung enthält.

Wenn jedoch die Abfrage zurückgibt mehrere Kinder:

Repo.all(Child |> with_last_attendance) 

nur eine der zurück Child Aufzeichnungen hat die last_attendance Vereinigung geladen (die limit: 1 ist „global“ auf die Abfrage).

Irgendwelche Ideen, wie man das zum Laufen bringt?

+0

Ich denke, es wäre schön, eine separate Ansicht für dieses Ding auf der Datenbankebene zu erstellen und zu verwenden. – JustMichael

Antwort

Verwandte Themen