2009-12-01 13 views
5

मैंने Datamapper सीखना शुरू किया और मुझे इसके बारे में क्या पसंद आया कि मैं अपने मॉडल को वास्तविक विरासत के साथ लिख सकता हूं।संगठनों के साथ रूबी डाटामैपर टेबल विरासत

अब मुझे आश्चर्य है, अगर यह संभव हो सकता है इस बारे में और अधिक उन्नत होने के लिए:

class Event 
    include DataMapper::Resource 
    property :id, Serial 
    property :begin, DateTime 
    property :type, Discriminator 
end 

class Talk<Event 
    property :title, String 
    belongs_to :meeting 
end 

class Meeting<Event 
    has n, :talks 
end 

कि कोड Talk और स्पष्ट रूप से के लिए :title स्तंभ बनाने के लिए विफल रहता है, discriminator स्तंभ यहाँ कम मूल्य की है, क्योंकि डेटाबेस दृश्य से, Talk और Meeting दोनों के लिए अलग-अलग टेबल होना चाहिए।

तो, अंत में, मैं Talk और Meeting रूप Event में लेकिन संभव अतिरिक्त गुणों के साथ और एक 0..1 के साथ परिभाषित एक ही गुण साझा करना चाहते हैं: n संबंध (एक बैठक कई वार्ता हो सकता है लेकिन वहाँ वार्ता कर रहे हैं बिना किसी बैठक के।) क्या कॉलम परिभाषाओं को दोहराए बिना/या विरासत छोड़ने के बिना इसे पूरा करने का कोई तरीका है?

संपादित

एक और उदाहरण देने के लिए: भाग मुझे पसंद है कि के बारे में विरासत बात यह है कि आम Event रों अलग से पूछे जा सकता है। इसलिए, जब मैं जानना चाहता हूं, अगर किसी निश्चित :begin दिनांक पर कुछ है, तो मुझे दो या दो से अधिक टेबल देखने की आवश्यकता नहीं है, लेकिन केवल Event तालिका से पूछताछ की जा सकती है। एक तरह से, निम्नलिखित संरचना मेरी जरूरतों को पूरा कर सकती है।

class Event 
    include DataMapper::Resource 
    property :id, Serial 
    property :begin, DateTime 
end 

class Talk 
    include DataMapper::Resource 
    property :id, Serial 
    property :title, String 
    belongs_to :event 
    belongs_to :meeting 
end 

class Meeting 
    include DataMapper::Resource 
    property :id, Serial 
    belongs_to :event 
    has n, :talks 
end 

हालांकि, ताकि इस का उपयोग करने के, मैं मैन्युअल रूप से एक Event हर बार बनाने के लिए, की आवश्यकता होगी मैं बनाने या किसी Talk संपादित करना चाहते हैं। यही है, मैं talk.begin या Talk.create(:begin => Time.now) नहीं कर सकता। क्या सभी कार्यों को पैच किए बिना और गुणों को विलय किए बिना इसके आसपास कोई रास्ता है? मॉडल का उपयोग करते समय मैं अंतर्निहित संरचना की याद दिलाना नहीं चाहता हूं।

+0

वास्तविक विरासत से आप किस प्रकार की विरासत का मतलब रखते हैं- एकल तालिका विरासत, कक्षा तालिका विरासत, या कंक्रीट तालिका विरासत? http://martinfowler.com/eaaCatalog/ – MattMcKnight

+0

मेरा मतलब रूबी वर्ग विरासत है। – Debilski

+0

जो कुछ भी इसका मतलब है टेबल-वार, मुझे इस पर बहुत अधिक परवाह नहीं है - जब तक मैं प्रत्येक रूबी मॉडल को अलग से उपयोग कर सकता हूं और उप-वर्ग से पैरेंट और बैक को असाइन कर सकता हूं। – Debilski

उत्तर

8

आप टॉक और बैठक में घटना की विशेषताओं को दोहराने के लिए चाहते हैं तो आपको एक मॉड्यूल में ले जाएं सकता है:

module EventFields 
    def self.included(base) 
    base.class_eval do 
     include DataMapper::Resource 
     property :id, DataMapper::Types::Serial 
     property :begin, DateTime 
     # other fields here 
    end 
    end 
end 

class Talk 
    include EventFields 
    property :title, String 
    belongs_to :meeting 
end 

class Meeting 
    include EventFields 
    has n, :talks 
end 

यह आपको अलग-अलग तालिकाओं दे लेकिन इसका मतलब दोहराव कम हो जाता है जाएगा।

+0

लेकिन दुर्भाग्य से इसका मतलब है, एक ही समय में सभी घटनाओं से पूछताछ करने के लिए कोई पारदर्शी तरीका नहीं है, इसलिए मुझे सभी प्रकार की घटनाओं के लिए डुप्लिकेट करना होगा। – Debilski

+0

सच है, लेकिन एकल तालिका विरासत केवल उन वस्तुओं के लिए उपयुक्त है जो अलग-अलग व्यवहार करते हैं लेकिन समान अंतर्निहित संरचना/तालिका होती है। आपको सभी विशेषताओं को संग्रहीत करने की हिट लेने की आवश्यकता होगी (उदाहरण के लिए इवेंट क्लास में) और प्रत्येक बच्चे वर्ग के अंदर संबंधों के लिए तर्क का निर्माण करना होगा। दुर्भाग्यवश, एसटीआई का सुझाव है कि कुछ जादू लचीला डेटा समाधान है लेकिन यह शायद ही कभी मामला है। जैसे-जैसे मॉडल अलग हो जाते हैं, वे बहुत कसकर मिल जाएंगे और एसटीआई अब और समझ में नहीं आएगा। – JamesAlmond

+0

आप सही हैं, मुझे ऐसी संरचनाओं के लिए किसी भी तरह समझौता करना होगा। उम्मीद है कि, किसी बिंदु पर, DataMapper :: एम्बेडेड वैल्यू आपके सुझाव को कम करने के लिए उपलब्ध होगा। – Debilski

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