在 Ecto 中,您可以像这样进行可重用/可组合的查询:
defmodule AModel
#...
def anonymous(q), do: q |> where([am], is_null(am.user_id))
end
在此博客文章中查看更多示例。
但是,我在使用多个连接时遇到了问题。
假设我们有一个看起来像这样的模式:
- AModel 属于 BModel
- BModel 属于 CModel
- CModel 属于 DModel
本文中提出的解决方案不适用于深度连接:
q = DModel
|> join(:inner, [dm], cm in assoc(dm, :c_models))
|> join(:inner, [_, cm], bm in assoc(cm, :b_models))
|> join(:inner, [_, _, bm], am in assoc(bm, :a_models))
|> AModel.anonymous
查询函数将绑定表作为第一个(第二个用于连接)参数。它包含以前的连接,但遗憾的是连接顺序很紧。
在我们的例子中,anonymous
函数以起始表为目标。但是在查询示例中,AModel 是第 4 个绑定...
摆脱这种订单依赖的任何想法或技术?
编辑 :
我从博客作者那里得到了答案。他告诉我,除了在表格中的位置之外,没有其他本地方式来处理绑定。他还给这篇文章强调了这一事实。
但是看在上帝的份上,如果顺序很重要,为什么我不能在它上面创建一个将 name 与绑定索引相关联的命名映射?
这要求太多了吗:p?