سؤال
أحاول الحصول على نتيجة أفضل ومنظمة من استخدام ميراث الطبقة مع mongomapper، ولكن وجود بعض المتاعب.
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
. وبعد هل ترى ما اعني؟
هل أسيء فهم كيفية عمل الميراث هنا؟ إذا كنت أفضل طريقة لتكرار هذا النوع من السلوك؟ أحاول اتباع هذه (النقطة 2) كمبدأ توجيهي لكيفية أريد هذا العمل. أفترض أنه يمكن تشغيله Link.all
للعثور على جميع الروابط، ولا تشمل كل فئة أخرى ترث من Item
. وبعد هل أنا مخطئ؟
المحلول
المثال الذي ترتبط به هو مضلل قليلا (أو ربما من الصعب اتباع) في أنه لا يظهر التعريف الكامل ل 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?">]