使用order_by预加载所有关联

时间:2018-05-04 03:14:49

标签: elixir phoenix-framework ecto

这就是我要做的事情:

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)])

但是我收到了这个错误:

** (ArgumentError) the Access calls for keywords expect the key to be an atom, got: [images: #Ecto.Query<from i in Dreamhouse.Image, order_by: [asc: i.index]>]

有人知道我在这里做错了吗?

2 个答案:

答案 0 :(得分:3)

我怀疑我能解释错误信息,但原因是:

[rows: from(...)] [images: from(...)]

不是有效的Elixir。检查:

[[foo: 42] [bar: 3.14]]

应该是:

[rows: from(...), images: from(...)]

答案 1 :(得分:3)

错误消息说,您正在尝试从关键字列表中获取元素,但是传递意外而不是原子。

例如,以下代码产生类似的错误:

keyword_list = [keyword: :argument]
keyword_list[unexpected: :structure]

所以问题在于这一行:

Repo.preload([rows: from(r in Row, order_by: r.index)] [images: from(i in Image, order_by: i.index)])

您可能希望提供一个关键字列表作为参数,其中包含您要预加载的所有关联:

Repo.preload([rows: from(r in Row, order_by: r.index), images: from(i in Image, order_by: i.index)])