Ecto Query - 为一些记录预加载一个关联对象

时间:2017-02-02 19:46:11

标签: database elixir ecto preload

我的应用拥有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对查询是“全局”的。)

有关如何使其发挥作用的任何想法?

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]))