6

在 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?

4

2 回答 2

2

使用命名绑定

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

于 2019-01-22T16:27:58.890 回答
-1

也许创建一些联结表


编辑:我可以看到也许我有点太简洁了。我的意思是说你可以在后端建立联结表,然后查询它们。这样您就无需担心在 Ecto 代码中构建连接。我希望这能让我的答案更清楚一点。

于 2015-10-16T12:40:45.533 回答