سؤال

أحاول الحصول على نتيجة أفضل ومنظمة من استخدام ميراث الطبقة مع 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?">]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top