【问题标题】:Ecto Query - Preload one associated object for a number of recordsEcto Query - 为多条记录预加载一个关联对象
【发布时间】:2017-02-02 19:46:10
【问题描述】:

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

关于如何让它发挥作用的任何想法?

【问题讨论】:

  • 我认为在数据库级别为这个东西创建一个单独的视图并使用它会很好。

标签: database elixir ecto preload


【解决方案1】:

从这里的讨论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]))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    相关资源
    最近更新 更多