如何在Phoenix中对Ecto预加载的Image记录按属性排序?
在Phoenix/Ecto中对预加载的关联记录排序
很简单!你不需要对Project本身做排序,只需要在预加载嵌套关联的时候,给images指定一个带排序条件的Ecto查询即可。
直接在预加载中指定排序
假设你想按Image的sort_order字段(整数)升序排列,修改代码如下:
project = Project |> Repo.get!(id) |> Repo.preload(rows: [images: from(i in Image, order_by: i.sort_order)])
如果需要降序排序,只需要调整order_by的方向:
from(i in Image, order_by: [desc: i.sort_order])
复用排序逻辑(可选)
如果这个排序逻辑在多个地方用到,建议在Image模块里封装一个查询函数,让代码更整洁:
defmodule MyApp.Image do use Ecto.Schema import Ecto.Query # ... 你的schema定义 ... def ordered_by_sort_order(query \\ __MODULE__, direction \\ :asc) do from i in query, order_by: [{direction, i.sort_order}] end end
之后预加载的时候就可以直接调用这个函数:
project = Project |> Repo.get!(id) |> Repo.preload(rows: [images: Image.ordered_by_sort_order()])
这个方法的核心是利用Ecto支持在预加载嵌套关联时传入自定义查询的特性,让数据库层面直接返回排序好的images列表,比加载后再在内存里排序更高效。
内容的提问来源于stack exchange,提问作者Bitwise
相关产品推荐
相关产品推荐

