2017-02-02 10 views
0

Мое приложение имеет схему/модель 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) 

только один из возвращенных записей Childlast_attendance имеет ассоциацию загруженную (limit: 1 является «глобальным» на запрос).

Любые идеи о том, как заставить это работать?

+0

Я думаю, было бы неплохо создать отдельный вид для этой вещи на уровне базы данных и использовать ее. – JustMichael

ответ