如何为Elixir中Ecto的Repo.preload添加限制选项
问题
我在Elixir中使用Ecto编写了一个为指定实体预加载关联的函数,当前实现如下:
@spec get(integer() | String.t(), list()) :: t() | nil def get(id, preloads \\ []) do Shop |> Repo.get(id) |> Repo.preload(preloads) end
我当前的调用方式如下:
Shop.get(id, [ :coustomers, :products ])
请问是否可以改为如下调用方式?:
Shop.get(id, [ :coustomers, {:limit,:products,3} ])
回答
不行,你写的{:limit,:products,3}格式并不是Ecto预加载支持的语法,直接这么写会触发错误。
如果要给预加载的关联添加数量限制,需要使用带查询条件的预加载格式,正确写法是通过from构建子查询来限制关联数量:
Shop.get(id, [ :coustomers, {:products, query: from p in Product, limit: 3} ])
你的原get函数不需要做任何修改,因为Repo.preload本身就支持这种包含查询逻辑的预加载参数格式。
另外注意代码里的拼写错误:coustomers应该是customers,建议修正避免后续出现关联找不到的问题。
内容的提问来源于stack exchange,提问作者IvonaK
相关产品推荐
相关产品推荐

