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?
Ich denke, es wäre schön, eine separate Ansicht für dieses Ding auf der Datenbankebene zu erstellen und zu verwenden. – JustMichael