在外生你可以重複使用的/可組合查詢,像這樣:藥劑外生:多個連接和可重複使用的/可組合查詢
defmodule AModel
#...
def anonymous(q), do: q |> where([am], is_null(am.user_id))
end
查看更多例子on this blog post。
不過,我使用多個連接面臨的一個問題。
讓我們假設我們有一個模式,它看起來像這樣:
- 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是第四個綁定...
任何想法或技術擺脫這種順序依賴?
編輯:
我從博客作者的答案。 他告訴我,沒有其他方法可以處理綁定,而不是表中的位置。 他也給this article強調這一事實。
但對於在上帝的份,如果只爲了此事,我爲什麼不能在其上創建與約束性指標相關聯的名字命名的映射?
這是過分的要求:P?
這裏是Ecto的創造者之一。這實際上是一個很難解決的問題,因爲只要我們將名稱綁定,衝突的機會就會大大增加,特別是因爲我們喜歡使用快捷方式,就像您使用am,bm等一樣。但我們知道目前的事情也是一個煩惱,我們還沒有一個好的解決方案(還)。 –
我正在考慮嘗試在綁定列表上創建疊加層。 當進行'join'時,我可以給出一個符合綁定位置的符號名稱。 然後使用'where'我可以提取所需的綁定提供的名稱。你認爲現在有可能創建這樣的機制? 我在考慮使用monad-like函數,它會返回{query,binding_names} ... – ProxyGear
我不認爲如果不更改Ecto,您將無法實現它。你可以在'def anonymous(q,pos)中給出這個位置,這樣做:q |> where([am:pos],is_null(am.user_id))''但是這更糟糕的IMO。 –