如何通过查询过滤预加载的记录

Thi*_*hib 2 elixir preload ecto

我列出了记录(包)列表。

这些包通过多对多关系链接到项目:

  • 包有_许多包项目
  • 项目有_许多包项目
  • 项目 has_many :packs,通过:[:packitems, :pack]
  • 打包 has_many :items,通过:[:packitems, :item]

当我列出包时,我想预加载它们的活动项目

def list_packs(params) do
  packs = Pack
    |> preload_active_items()
    |> Repo.all()
    |> Repo.preload([:classroom, [packlanguages: :language]])
end

defp preload_active_items(query) do
  query
    |> join(:left, [pack], _ in assoc(pack, :packitems))
    |> join(:left, [_, pi], _ in assoc(pi, :item))
    |> where([..., i], i.active == true)
    |> preload([_, pi, i], [packitems: {pi, item: i}])
    # |> preload([_, pi, i], [packitems: {pi, item: ^from(i, where: i.active == true)}])
end
Run Code Online (Sandbox Code Playgroud)

一切工作正常(我检索了包及其预加载的项目),但我对那些具有活动项目的包进行了过滤。

我尝试用虚线替换 where 子句,但语法不正确。

任何想法 ?

Thi*_*hib 5

我终于找到了方法:

def list_packs(params) do
  pi_query = from pi in PackItem,
    join: i in assoc(pi, :item),
    where: i.active == true
  packs = Pack
    |> Repo.all()
    |> Repo.preload([:classroom, [packlanguages: :language, packitems: pi_query]])
end
Run Code Online (Sandbox Code Playgroud)