将Ecto片段提取为变量

问题描述 投票:0回答:1

我有一个片段,该片段是重复的并且非常复杂。我想将其提取到变量/函数中并重复使用多次,而不是多次编写。这是我到目前为止用许多不同方法尝试过的简化示例:

f = dynamic([u], fragment("order by name desc"))
query = from(u in User)
        |> order_by([u], ^f)
Repo.all(query)

根据documentation,应该可以使用dynamic,但是我尝试在order_byselecthaving或任何类似的错误消息中进行尝试:

(ArgumentError) expected a field as an atom, a list or keyword list in `order_by`, got: `dynamic([u], fragment("order by name desc"))`

我将如何实现?


更新1

这里是更真实的例子。以下代码有效:

    from(p in Photo,
      join: pv in assoc(p, :v),
      left_join: pl in assoc(p, :l),
      left_join: pc in assoc(p, :c),
      select: %{p | last_activity_at: fragment("greatest(?, ?, ?)", max(p.inserted_at), max(pl.inserted_at), max(pc.inserted_at))},
      group_by: p.id,
      order_by: [desc: fragment("greatest(?, ?, ?)", max(p.inserted_at), max(pl.inserted_at), max(pc.inserted_at))]
    )

但是,我无法通过提取片段或将其与dynamic或其他功能一起使用来使它正常工作。

elixir ecto
1个回答
0
投票

在与order_by完全相同的文档中有Ecto.Query.dynamic/2的示例

Ecto.Query.dynamic/2
© www.soinside.com 2019 - 2024. All rights reserved.