2015-05-16 9 views
17

एक्टो पॉलीमोर्फिक एसोसिएशन का समर्थन करता प्रतीत होता है क्योंकि मैंने https://github.com/elixir-lang/ecto/issues/389 और इससे जुड़े इसके संबंधित मुद्दों को पढ़ा है।पॉलिमॉर्फिक एसोसिएशन एक्टो के साथ कैसे काम करता है?

मान लें कि मुझे कार्य और ईवेंट मॉडल पर एक टिप्पणी मॉडल एसोसिएशन की आवश्यकता है। यदि कस्टम स्रोत के साथ Ecto संघ की मेरी समझ सही है, तो हम चार टेबल और तीन मॉडल,

टेबल्स

  • कार्यों
  • घटनाओं
  • tasks_comments
  • events_comments
की जरूरत

मॉडल

  • टास्क
  • घटना
  • टिप्पणी

टास्क और घटना मॉडल के रूप में नीचे दिए गए कस्टम स्रोत के साथ has_many संघ होगा।

defmodule ExampleApp.Task do 
    use ExampleApp.Web, :model 

    schema "tasks" do 
    field :title, :string 
    field :body, :string 
    has_many :comments, {"tasks_comments", Comment} 

    timestamps 
    end 
end 

defmodule ExampleApp.Event do 
    use ExampleApp.Web, :model 

    schema "events" do 
    field :title, :string 
    field :body, :string 
    has_many :comments, {"events_comments", Comment} 

    timestamps 
    end 
end 

अब मैं क्या समझ में नहीं आता टिप्पणी मॉडल की तरह दिखना चाहिए कैसे है?

टिप्पणी मॉडल दो तालिका कैसे संभालता है? और यह अलग-अलग मॉडलों के अनुरूप है?

उत्तर

17

यदि आप उपरोक्त डिज़ाइन के साथ जा रहे हैं, तो टिप्पणी मॉडल में वास्तव में कोई तालिका नहीं है, इसकी तालिका एसोसिएशन द्वारा परिभाषित की गई है। तो पाने के लिए सभी घटनाओं के लिए सभी टिप्पणियों, आप कर सकते हैं:

from c in {"events_comments", Comment} 

कुछ मामलों में यह एक महान तकनीक है और यह मॉडल के साथ आप नहीं जोड़े के लिए भंडारण (टेबल) की अनुमति देता है। आप अलग-अलग तालिकाओं के लिए एक ही मॉडल का उपयोग कर सकते हैं।

हालांकि, अगर आप सभी टिप्पणियां प्राप्त करना चाहते हैं और उन्हें दोनों घटनाओं और कार्यों के साथ जोड़ना चाहते हैं, तो आप रिश्तों के माध्यम से उपयोग कर सकते हैं। आपके पास "ईवेंट" < -> "events_comments" < -> "टिप्पणियां" और "कार्य" < -> "task_comments" < -> "टिप्पणियां" होंगी।

एक और तरीका है पॉलिमॉर्फिक संघों को करने के रेल मार्ग के साथ जाना और टिप्पणी मॉडल में "दयालु" कॉलम परिभाषित करना। यह डेटाबेस संदर्भों को तोड़ देता है लेकिन यह इससे निपटने का एक और तरीका है।

मैं इस मामले पर एक्टो दस्तावेज़ों में सुधार करूंगा, प्रतिक्रिया के लिए धन्यवाद!

+0

जोस, उत्तर देने के लिए धन्यवाद। आपके उत्तरों से उत्पन्न होने वाले कई प्रश्न हैं। शायद यह सब तुच्छ है। 1. "टिप्पणी मॉडल में वास्तव में कोई तालिका नहीं है" => टिप्पणी मॉडल स्कीमा के बिना कैसे काम करता है। मैं 'schema == टेबल' पढ़ रहा हूँ। स्कीमा के बिना मैं टिप्पणी कैसे सत्यापित कर सकता हूं, और इस प्रकार बिना किसी बदलाव के? 2. इको एसोसिएशन में 'रेल मार्ग' कैसे काम करता है? क्या कोई उदाहरण कोड है? मुझे स्रोत कोड या दस्तावेज़ पढ़ने को नहीं लगता है जो यह समर्थित है। – shankardevy

+1

1।टिप्पणी मॉडल में एक टेबल नहीं है लेकिन एसोसिएशन के माध्यम से बनाया गया है। तो रहस्य 'assoc (कार्य, टिप्पणियां)' और कभी '% टिप्पणी {}' का उपयोग करना है। मैंने यहां उन लोगों को दस्तावेज किया है: https://github.com/elixir-lang/ecto/commit/1d98ad795b8707ff8a9496657112603c14a64cc2 –

+1

2. रेल मार्ग Ecto संघों में काम नहीं करता है क्योंकि यह आमतौर पर खराब अभ्यास है क्योंकि डेटाबेस इसके संदर्भ नहीं रख सकता है। आपको अपने प्रश्नों को बनाना होगा और उचित फ़ील्ड हाथ से रखना होगा। –

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