Ecto:使用has_many关联对集合中的预加载数据进行排序

nit*_*moe 7 elixir ecto phoenix-framework

假设我有这个用于获取所有线程:

Thread |> Thread.ordered |> Repo.all |> Repo.preload([:posts])
Run Code Online (Sandbox Code Playgroud)

我怎么能为order_by子句提供:posts?我似乎无法在引用的文档中找到任何内容Ecto.Repo.preload/1,因此所提供的示例都不会对确定如何正确使用此语法有帮助.

Har*_*cas 13

Ecto.Query模块使得它可以很方便某些查询也适用于类似的东西堆载预压.

我们实现这一目标的方法是将查询传递给 preload函数,然后将preload的结果限制为该查询.

例如,在您的情况下:

import Ecto.Query # => Needed to use the ecto query helpers

Thread 
|> Thread.ordered 
|> Repo.all 
|> Repo.preload([posts: (from p in Post, order_by: p.published_at)])
Run Code Online (Sandbox Code Playgroud)

(假设您在帖子上发布了字段)

  • 这不再起作用了.现在你需要编写一个查询,然后在将它传递给preload时固定该查询,如下所示:`comments_query =来自注释中的c,order_by:c.popularity,limit:5 Repo.all from p in Post,preload: [comments:^ comments_query]`https://hexdocs.pm/ecto/Ecto.Query.html#preload/3-preload-queries (4认同)
  • 感谢您的帮助,它的确有效!我还需要`导入Ecto.Query`如果有人发现这个帖子并且有同样的问题. (2认同)