2015-10-23 7 views
11

साथ Ecto संघ चलो कहते हैं कि मैं दो मॉडल, Post और Comment और टिप्पणी मॉडल 2 प्रकार, normal और fancy जो comments तालिका में कॉलम type द्वारा परिभाषित किया गया है में से 1 हो सकता है चला रहे हैं।एक शर्त

अब मैं अपने Post मॉडल पर 2 संघों जोड़ना चाहते हैं, जहां एक फैंसी टिप्पणियों और सामान्य लोगों को एक करने के लिए संदर्भित करता है, मैं इसे कैसे करना होगा?

has_many :fancy_comments, MyApp.Comment, where: [type: 0] 
has_many :normal_comments, MyApp.Comment, where: [type: 1] 

उत्तर

13

यह Ecto में उपलब्ध नहीं है, वहाँ this GitHub issue पर इसके बारे में एक लंबी चर्चा है: तो मैं कुछ इस तरह करना चाहते हैं।

आप इस के लिए एक composable क्वेरी इस्तेमाल कर सकते हैं:

defmodule MyApp.Comment do 

    ...schema, etc. 

    def fancy(query) do 
    from c in query, 
     where: type == 0 
    end 

    def normal(query) do 
    from c in query, 
     where: type == 1 
    end  
end 

तब आप उस के आधार पर has_many :comments, MyApp.Comment और क्वेरी का उपयोग कर सकते हैं:

assoc(post, :comments) |> Comment.fancy() |> Repo.all() 

यहाँ एक ब्लॉग पोस्ट के बारे में composable queries है।

तुम भी एक प्रश्न के साथ एक प्रीलोड उपयोग कर सकते हैं:

fancy_query = from(c in Comments, where: type == 0) 
Repo.preload(post, comments: fancy_query) 
+0

आप जानना चाहते हैं कि इसे लागू करना संभव है ऐसा नहीं करते हैं और यदि इसे लागू करने की योजना है? वास्तव में 'कहां' नहीं बल्कि सामान्य रूप से फ़िल्टर करने के लिए कुछ? – JustMichael

+0

मुझे यकीन है कि इसे लागू करना संभव है - https://github.com/elixir-lang/ecto/issues/659#issuecomment-121233468 सुझाव देगा कि इसे लागू करने की कोई योजना नहीं है। चर्चा मेरे पहले उदाहरण की तरह इसे प्राप्त करने के लिए संगत क्वेरी का उपयोग करने की ओर बढ़ती है। – Gazler

+0

ओह मैं देखता हूं। धन्यवाद – JustMichael

संबंधित मुद्दे