You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 13:42:03