我有一个片段,该片段是重复的并且非常复杂。我想将其提取到变量/函数中并重复使用多次,而不是多次编写。这是我到目前为止用许多不同方法尝试过的简化示例:
f = dynamic([u], fragment("order by name desc"))
query = from(u in User)
|> order_by([u], ^f)
Repo.all(query)
根据documentation,应该可以使用dynamic
,但是我尝试在order_by
,select
,having
或任何类似的错误消息中进行尝试:
(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或其他功能一起使用来使它正常工作。
在与order_by
完全相同的文档中有Ecto.Query.dynamic/2
的示例
Ecto.Query.dynamic/2