Question
Je suis en train d'obtenir un meilleur résultat et organisée d'utiliser l'héritage de classe avec MongoMapper, mais ayant quelques problèmes.
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 la liste des Item.all
tous les résultats, donc y compris lui-même, Picture
et Video
. Mais si l'article est en fait une Picture
, je l'aime à retourner si je courais Picture.all
et pas si je cours Video.all
. Voyez-vous ce que je veux dire?
Est-ce que je comprends mal comment l'héritage fonctionne ici? Si je suis ce qui est la meilleure façon de reproduire ce genre de comportement? Je suis en train de suivre cette (point 2) comme ligne directrice de la façon dont je veux ce travail. Je suppose qu'il peut courir Link.all
trouver tous les liens, et ne pas inclure toutes les autres classes qui hérite de Item
. Ai-je tort?
La solution
L'exemple que vous lien vers est un peu trompeur (ou peut-être juste difficile à suivre) en ce qu'elle ne montre 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 _type
clé sur le modèle parent. MongoMapper établira alors automatiquement la clé du nom de la 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?">]