Мое приложение имеет схему/модель Child
, у которой есть много связанных ChildAttendance
записей.Ecto Query - предварительно загрузить один связанный объект для нескольких записей
Я могу довольно легко поджать все child_attendances
для данного ребенка:
from ch in Child, preload: [:child_attendances]
То, что я хотел бы сделать, это предварительно загрузить только последний рекорд посещаемости для данного ребенка, или набор детей.
Я попытался следующие:
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
указанных работ, но только тогда, когда родительский запрос возвращает один ребенок (т.е. limit: 1
ограничивает количество записей посещаемости возвращаемой в общей сложности).
Например,
Repo.one!(Child |> where([ch], ch.id == ^child_id) |> with_last_attendance)
работает, как ожидалось, с ребенком записи, содержащей одногоChildAttendance
запись загружается в last_attendance
ассоциации.
Однако, если запрос возвращает несколько детей:
Repo.all(Child |> with_last_attendance)
только один из возвращенных записей Child
last_attendance
имеет ассоциацию загруженную (limit: 1
является «глобальным» на запрос).
Любые идеи о том, как заставить это работать?
Я думаю, было бы неплохо создать отдельный вид для этой вещи на уровне базы данных и использовать ее. – JustMichael