【发布时间】:2020-04-06 02:52:13
【问题描述】:
我有一个片段,它是重复的并且相当复杂。我想将它提取到变量/函数中并多次重复使用,而不是多次编写它。这是一个简化的示例,到目前为止我尝试了许多不同的方法:
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))]
)
但是,我无法通过提取片段或将其与动态或其他方式一起使用来使其工作。
【问题讨论】:
-
你能试试
|> order_by(f)吗?