2015-10-16 82 views
5

在外生你可以重複使用的/可組合查詢,像這樣:藥劑外生:多個連接和可重複使用的/可組合查詢

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?

+1

這裏是Ecto的創造者之一。這實際上是一個很難解決的問題,因爲只要我們將名稱綁定,衝突的機會就會大大增加,特別是因爲我們喜歡使用快捷方式,就像您使用am,bm等一樣。但我們知道目前的事情也是一個煩惱,我們還沒有一個好的解決方案(還)。 –

+0

我正在考慮嘗試在綁定列表上創建疊加層。 當進行'join'時,我可以給出一個符合綁定位置的符號名稱。 然後使用'where'我可以提取所需的綁定提供的名稱。你認爲現在有可能創建這樣的機制? 我在考慮使用monad-like函數,它會返回{query,binding_names} ... – ProxyGear

+1

我不認爲如果不更改Ecto,您將無法實現它。你可以在'def anonymous(q,pos)中給出這個位置,這樣做:q |> where([am:pos],is_null(am.user_id))''但是這更糟糕的IMO。 –

回答

-1

也許創造一些junction tables


編輯:我可以看到,也許我有點太簡潔了。我的意思是說你可以在後端建立聯結表,然後查詢它們。這樣你就不用擔心在你的Ecto代碼中建立連接。我希望這能讓我的答案更清晰一些。

+0

我不明白路口如何在這裏提供幫助。 你能提供更多細節嗎? – ProxyGear

+0

我編輯了我的答案,以提供更多細節。 –

+0

好的,感謝您的編輯。但是這意味着:a)複製/更改數據模式以解決程序性問題,聽起來是錯誤的。 b)由於數據量大,它確實可以負擔得起 – ProxyGear