2015-10-16 6 views
5

Ecto में आप इतने की तरह पुन: प्रयोज्य/composable प्रश्नों बना सकते हैं:अमृत Ecto: कई जुड़ जाता है और पुन: प्रयोज्य/composable प्रश्नों

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 फ़ंक्शन प्रारंभिक तालिका को लक्षित करता है। हालांकि क्वेरी उदाहरण में, एमोडेल चौथा बाध्यकारी है ...

इस आदेश निर्भरता से छुटकारा पाने के लिए कोई विचार या तकनीकी?

संपादित करें:

मैं ब्लॉग लेखक की ओर से एक जवाब मिलता है। उसने मुझे बताया कि तालिका में स्थिति से बाइंडिंग को संभालने का कोई अन्य मूल तरीका नहीं है। उन्होंने इस तथ्य को हाइलाइट करते हुए this article भी दिया।

लेकिन भगवान के लिए, अगर आदेश केवल मामला है, तो मैं इसे नामकरण मैपिंग क्यों नहीं बना सकता जो बाध्यकारी सूचकांक के साथ नाम को जोड़ता है?

क्या यह पूछने के लिए बहुत कुछ है: पी?

+1

यहां एक्टो रचनाकारों में से एक। यह वास्तव में हल करने के लिए एक बहुत ही कठिन समस्या है क्योंकि जब तक हम नाम बाध्यकारी बनाते हैं, तब तक संघर्षों का मौका बहुत बढ़ जाता है, विशेष रूप से क्योंकि हम शॉर्टकट का उपयोग करना पसंद करते हैं, जैसे आपने उपयोग किया है, बीएम और इसी तरह। लेकिन हम जानते हैं कि वर्तमान संबंध भी एक परेशानी है, हमारे पास इसके लिए कोई अच्छा समाधान नहीं है (अभी तक)। –

+0

मैं बाध्यकारी सूची के ऊपर एक ओवरले बनाने की कोशिश करने के लिए सोच रहा था। 'जॉइन' बनाते समय मैं एक प्रतीक नाम दे सकता हूं जो बाध्यकारी स्थिति से मेल खाता है। फिर 'कहां' का उपयोग करके मैं आवश्यक बाध्यकारी नाम प्रदान कर सकता हूं। क्या आपको लगता है कि वर्तमान में इस तरह के मैकेनिक बनाना संभव है? मैं मोनैड-जैसे फ़ंक्शन का उपयोग कर सोच रहा था जो {query, binding_names} लौटाएगा ... – ProxyGear

+1

मुझे नहीं लगता कि आप इसे एक्टो को बदले बिना हासिल कर पाएंगे।मैं स्थिति को दे सकता हूं, जैसा कि मुझे लगता है, 'def अनाम (q, pos) में, करें: q |> जहां ([am: pos], is_null (am.user_id)) 'लेकिन यह बदतर आईएमओ है। –

उत्तर

-1

शायद कुछ junction tables बनाएं?


संपादित करें: मैं देख सकता हूं कि शायद मैं थोड़ा सा था। मेरा कहना है कि आप बैकएंड पर जंक्शन टेबल बना सकते हैं और फिर उनसे पूछ सकते हैं। इस तरह आपको अपने एक्टो कोड में शामिल होने के बारे में चिंता करने की आवश्यकता नहीं है। मुझे आशा है कि मेरा जवाब थोड़ा स्पष्ट हो जाएगा।

+0

मुझे नहीं पता कि जंक्शन यहां कैसे मदद कर सकते हैं। क्या आप अधिक जानकारी दे सकते हैं? – ProxyGear

+0

मैंने थोड़ा और विवरण देने के लिए अपना जवाब संपादित कर दिया है। –

+0

ठीक है, संपादन के लिए धन्यवाद। हालांकि इसका मतलब है: ए) एक प्रोग्रामेटिक समस्या को हल करने के लिए डेटा स्कीमा डुप्लिकेट/बदलें, गलत लगता है। बी) यह वास्तव में डेटा आकार – ProxyGear

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