我使用Ecto从数据库中请求数据,并且我已使用以下代码预加载 price_discount 过滤的猫。< / p>
Item
|> join(:inner, [i], c in Cat, c.food_category_id == i.id)
|> where([i, c], is_nil(c.price_discount))
|> preload([i, c],
[
cats: c,
cats: :houses
])
这很好用,但现在我想通过id订购Houses,所以我正在跳这项工作:
Item
|> join(:inner, [i], c in Cat, c.food_category_id == i.id)
|> where([i, c], is_nil(c.price_discount))
|> preload([i, c],
[
cats: c,
cats: [
houses: from(h in Houses, order_by: h.id)
]
])
但它没有,这就是错误:
from(h in Houses, order_by: h.id()) is not a valid preload expression. preload expects an atom, a list of atoms or a keyword list with more preloads as values. Use ^ on the outermost preload to interpolate a value
唯一有效的帖子是使用以下其中一项:
cats: c
houses: from(h in Houses, order_by: h.id)
以下作品,使用^: 项目 |&GT; join(:inner,[i],c in Cat,c.food_category_id == i.id) |&GT; where([i,c],is_nil(c.price_discount)) |&GT;预载([i,c], ^ [ 猫: [ 房屋:从(h in Houses,order_by:h.id) ] ])
这是Ecto中的错误吗?
答案 0 :(得分:3)
如果要为预加载及其嵌套预加载提供自定义查询,可以使用元组语法,其中第一个元素是主查询,第二个元素是预加载列表,就像你想要的那样处于最高水平。
您可以通过以下方式实现您的目标:
|> preload([i, c], [cats: {c, houses: ^from(h in Houses, order_by: h.id)}])