2010-01-04 6 views
7

J'essaie d'obtenir un résultat mieux organisé en utilisant l'héritage de classe avec MongoMapper, mais en ayant des problèmes.MongoMapper Parent Inheritance

class Item 
    include MongoMapper::Document 

    key :name, String 
end 

class Picture < Item 
    key :url, String 
end 

class Video < Item 
    key :length, Integer 
end 

Quand je lance les commandes suivantes, ils ne reviennent pas tout à fait ce que je me attends.

>> 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?">] 

Ils sont tous le même résultat, j'attendre d'avoir Item.all liste tous les résultats, donc y compris lui-même, Picture et Video. Mais si l'article est en fait un Picture, je voudrais qu'il soit retourné si j'ai couru Picture.all et pas si je cours Video.all. Est-ce que tu vois ce que je veux dire? Est-ce que je me méprends sur la façon dont l'héritage fonctionne ici? Si je suis ce qui est le meilleur moyen de reproduire ce genre de comportement? J'essaie de suivre (point 2) comme une ligne directrice de la façon dont je veux ce travail. Je suppose qu'il peut exécuter Link.all pour trouver tous les liens, et ne pas inclure toutes les autres classes qui héritent de Item. Ai-je tort?

Répondre

10

L'exemple que vous liez est un peu trompeur (ou peut-être juste difficile à suivre) en ce sens qu'il n'affiche pas la définition complète pour le modèle Item. Pour utiliser l'héritage dans vos modèles, vous devez définir une clé _type sur le modèle parent. MongoMapper définira alors automatiquement cette clé au nom de classe de la classe réelle de ce document. Ainsi, par exemple, vous auriez des modèles maintenant ressembler à ceci:

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 

et la sortie de vos recherches (en supposant que vous avez créé un objet Picture) va se transformer en:

>> 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

Merci beaucoup. C'était assez frustrant pour dire le moins! – Garrett