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

Ecto预加载多关联并排序触发ArgumentError,求排查错误原因

解决Ecto预加载关联数据时的ArgumentError问题

嘿,我一眼就看出问题出在哪了——你调用Repo.preload的时候,语法格式写错啦!

看你原来的代码:

project = Repo.get!(Project, id) |> Repo.preload([rows: from(r in Row, order_by: r.index)] [images: from(i in Image, order_by: i.index)])

你把rows和images这两个预加载项拆成了两个独立的列表,中间既没加逗号,也没把它们放到同一个外层列表里。Ecto根本没法识别这种写法,它把第二个列表当成了Access调用的键,这才抛出了那个“key应该是atom”的错误。

正确的写法是把两个预加载项都放在同一个关键字列表里,用逗号分隔开就行:

# 分行写更易读
project = Repo.get!(Project, id) |> Repo.preload([
  rows: from(r in Row, order_by: r.index),
  images: from(i in Image, order_by: i.index)
])

要是想写成一行,也得确保两个键值对都在同一个方括号内部:

project = Repo.get!(Project, id) |> Repo.preload([rows: from(r in Row, order_by: r.index), images: from(i in Image, order_by: i.index)])

本质上,Repo.preload接受的是一个关键字列表,所有需要预加载并排序的关联都得放在这个列表里面,不能拆成多个列表传递哦。

内容的提问来源于stack exchange,提问作者Bitwise

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:54:46