Elixir Ecto:多个连接和可重用/可组合查询

Pro*_*ear 6 orm dependencies join elixir ecto

在Ecto中,您可以像这样制作可重用/可组合的查询:

defmodule AModel
  #...

  def anonymous(q), do: q |> where([am], is_null(am.user_id))
end
Run Code Online (Sandbox Code Playgroud)

请参阅此博客文章中的更多示例.

但是,我遇到使用多个连接的问题.

假设我们有一个如下所示的模式:

  • 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
Run Code Online (Sandbox Code Playgroud)

查询函数将绑定表作为第一个(连接的第二个)参数.它包含以前的连接,并且很难加入订单.

在我们的例子中,anonymous函数以起始表为目标.但是在查询示例中,AModel是第4个绑定...

任何想法或技术摆脱这种顺序依赖?

编辑:

我从博客作者那里得到了答案.他告诉我,没有本地的其他方式来处理绑定而不是表中的位置.他还在这篇文章中强调了这一事实.

但是为了上帝的缘故,如果顺序只是重要的,为什么我不能在它上面创建一个将名称与绑定索引相关联的命名映射?

这问题太多了:p?

Nat*_*ong 3

使用命名绑定

Ecto 3.0为此用例添加了命名绑定。