【问题标题】:Ecto: Order preloaded data in collection with has_many associationEcto:使用 has_many 关联订购集合中的预加载数据
【发布时间】:2017-09-05 21:49:07
【问题描述】:

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

Thread |> Thread.ordered |> Repo.all |> Repo.preload([:posts])

如何为:posts 提供 order_by 子句?我似乎无法在文档中找到任何引用 Ecto.Repo.preload/1 的内容,因此提供的示例似乎都没有帮助弄清楚如何正确使用此语法。

【问题讨论】:

标签: elixir phoenix-framework ecto


【解决方案1】:

Ecto.Query 模块使得将某些查询也应用于预加载等事情变得非常容易。

我们实现这一点的方法是将查询传递到预加载函数,然后将预加载的结果限制到该查询。

例如,在您的情况下:

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

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

【讨论】:

  • 感谢您的帮助,它有效!如果其他人发现此线程并遇到相同问题,我还需要import Ecto.Query
  • 这不再起作用了。现在您需要编写一个查询,然后在将其传递给预加载时固定该查询,如下所示:comments_query = from c in Comment, order_by: c.popularity, limit: 5 Repo.all from p in Post, preload: [comments: ^comments_query]hexdocs.pm/ecto/Ecto.Query.html#preload/3-preload-queries
  • 如果您想按另一个表中的列排序(通过连接),这可能吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多