2010-01-04 21 views
7

मैं मोंगोमैपर के साथ कक्षा विरासत का उपयोग करने से बेहतर और संगठित परिणाम प्राप्त करने की कोशिश कर रहा हूं, लेकिन कुछ परेशानी है।मोंगोमैपर अभिभावक विरासत

class Item 
    include MongoMapper::Document 

    key :name, String 
end 

class Picture < Item 
    key :url, String 
end 

class Video < Item 
    key :length, Integer 
end 

जब मैं निम्नलिखित आदेश चलाता हूं, तो वे जो कुछ भी उम्मीद कर रहे हैं वह काफी वापस नहीं लौटाता है।

>> Item.all 
=> [#<Item name: "Testing", created_at: Sun, 03 Jan 2010 20:02:48 PST -08:00, updated_at: Mon, 04 Jan 2010 13:01:31 PST -08:00, _id: 4b416868010e2a04d0000002, views: 0, user_id: 4b416844010e2a04d0000001, description: "lorem?">] 
>> Video.all 
=> [#<Video name: "Testing", created_at: Sun, 03 Jan 2010 20:02:48 PST -08:00, updated_at: Mon, 04 Jan 2010 13:01:31 PST -08:00, _id: 4b416868010e2a04d0000002, views: 0, user_id: 4b416844010e2a04d0000001, description: "lorem?">] 
>> Picture.all 
=> [#<Picture name: "Testing", created_at: Sun, 03 Jan 2010 20:02:48 PST -08:00, updated_at: Mon, 04 Jan 2010 13:01:31 PST -08:00, _id: 4b416868010e2a04d0000002, views: 0, user_id: 4b416844010e2a04d0000001, description: "lorem?">] 

वे सभी एक ही परिणाम हैं, मैं Item.all सूची परिणामों के सभी की उम्मीद करेंगे, तो खुद को भी शामिल है, Picture, और Video। लेकिन अगर आइटम वास्तव में Picture है, तो मैं Picture.all चलाता हूं और यदि मैं Video.all चलाता हूं तो मैं इसे वापस करना चाहता हूं। क्या तुमने देखा कि मेरा क्या मतलब है?

क्या मैं गलत समझता हूं कि विरासत यहां कैसे काम करती है? अगर मैं इस तरह के व्यवहार को दोहराने का सबसे अच्छा तरीका हूं? मैं this (बिंदु 2) का पालन करने की कोशिश कर रहा हूं कि मैं यह काम कैसे करूं। मुझे लगता है कि वह सभी लिंक खोजने के लिए Link.all चला सकता है, और Item से प्राप्त होने वाली हर दूसरी कक्षा को शामिल नहीं कर सकता है। क्या मै गलत हु?

उत्तर

10

उदाहरण जो आप लिंक करते हैं वह थोड़ा भ्रामक है (या शायद पालन करना मुश्किल है) जिसमें यह Item मॉडल के लिए पूर्ण परिभाषा नहीं दिखाता है। अपने मॉडल में विरासत का उपयोग करने के लिए, आपको मूल मॉडल पर एक कुंजी _type परिभाषित करने की आवश्यकता होगी। MongoMapper तब उस कुंजी को उस दस्तावेज़ की वास्तविक श्रेणी के वर्ग नाम पर स्वचालित रूप से सेट करेगा। तो, उदाहरण के लिए, आप मॉडल अब इस प्रकार दिखाई देगा:

class Item 
    include MongoMapper::Document 

    key :name, String 
    key :_type, String 
end 

class Picture < Item 
    key :url, String 
end 

class Video < Item 
    key :length, Integer 
end 

और अपनी खोजों के उत्पादन में (यह मानते हुए कि आप एक Picture वस्तु बनाया) हो जाएगा में:

>> Item.all 
=> [#<Picture name: "Testing", _type: "Picture", created_at: Sun, 03 Jan 2010 20:02:48 PST -08:00, updated_at: Mon, 04 Jan 2010 13:01:31 PST -08:00, _id: 4b416868010e2a04d0000002, views: 0, user_id: 4b416844010e2a04d0000001, description: "lorem?">] 
>> Video.all 
=> [] 
>> Picture.all 
=> [#<Picture name: "Testing", _type: "Picture", created_at: Sun, 03 Jan 2010 20:02:48 PST -08:00, updated_at: Mon, 04 Jan 2010 13:01:31 PST -08:00, _id: 4b416868010e2a04d0000002, views: 0, user_id: 4b416844010e2a04d0000001, description: "lorem?">] 
+0

बहुत बहुत शुक्रिया। कम से कम कहने के लिए बहुत निराशाजनक था! – Garrett

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