Join Elixir-Exto:多连接和可重用/可组合查询

Join Elixir-Exto:多连接和可重用/可组合查询,join,orm,dependencies,elixir,ecto,Join,Orm,Dependencies,Elixir,Ecto,在EXTO中,您可以进行如下可重用/可组合查询: defmodule AModel #... def anonymous(q), do: q |> where([am], is_null(am.user_id)) end 请参阅更多示例 但是,我在使用多个联接时遇到了一个问题 假设我们有一个如下所示的模式: AModel属于BModel BModel属于CModel CModel属于DModel 本文提出的解决方案实际上不适用于深度联接: q = DModel |>

在EXTO中,您可以进行如下可重用/可组合查询:

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
查询函数将绑定表作为第一个(join的第二个)参数。 它包含以前的连接,遗憾的是连接顺序很紧

在我们的例子中,
anonymous
函数以起始表为目标。 然而在查询示例中,AModel是第四个绑定

有什么想法或技术来摆脱这种订单依赖性吗

编辑:

我从博客作者那里得到了答案。 他告诉我,除了按表中的位置处理绑定之外,没有其他方法可以处理绑定。 他还强调了这一事实

但看在上帝的份上,若顺序只是个问题,为什么我不能在它上面创建一个命名映射,将名称和绑定索引关联起来呢

这个问题问得太多了吗:p?

也许可以创造一些


编辑:我可以看出,也许我有点太简洁了。我的意思是,您可以在后端构建连接表,然后查询它们。这样,您就不必担心在您的EXTO代码中构建连接。我希望这能让我的答案更清楚一些。

使用命名绑定
为这个用例添加了Ecto 3.0。

我不知道连接在这里有什么帮助。你能提供更多细节吗?好的,谢谢你的编辑。然而,这意味着:a)复制/更改数据模式以解决编程问题,听起来是错误的。b) 由于数据量大,它真的能负担得起。您确实征求过意见。:)我同意复制数据并不理想,但如果是在这和编写迟钝、复杂的代码之间,我会在一周中的任何一天进行反规范化。是的,没问题。您的答案在某些情况下适用;)不过,我希望有人能在代码级别提供一些东西,以删除连接顺序依赖关系。我真不敢相信这个库会阻塞这种常见的用例。这里的一个外太空创造者。这实际上是一个很难解决的问题,因为只要我们使名称绑定,冲突的机会就会大大增加,特别是因为我们喜欢使用快捷方式,就像您使用的am、bm等。但是我们知道现在的事情也是一件令人烦恼的事情,我们只是还没有一个好的解决方案。当使
连接时
我可以给出与绑定位置匹配的符号名称。然后使用
where
I可以提取提供名称的所需绑定。你认为现在有可能创造这样的机制吗?我在考虑使用类似monad的函数返回{query,binding_names}…我认为如果不更改exto,您将无法实现它。我认为,你可以给出这个位置,就像在
definanonymous(q,pos),do:q |>where([am:pos],is_null(am.user_id))
中一样,但在我看来更糟糕。我没有时间测试它。但是如果你这么说的话,我想它回答了这个问题。