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
相关产品推荐
相关产品推荐

