我的应用拥有Child
架构/模型,其中包含许多关联的ChildAttendance
条记录。
我可以非常轻松地预加载给定孩子的所有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
对查询是“全局”的。)
有关如何使其发挥作用的任何想法?
答案 0 :(得分:3)
从这里的讨论https://elixirforum.com/t/ecto-and-preloading-most-recent-record-from-association/520,以下内容可以解决您的问题。
Repo.preload(
Repo.all(Child),
child_attendances: from(ca in ChildAttendance,
distinct: ca.child_id,
order_by: [desc: ca.in_at]))