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?

Était-ce utile?

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?">]
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top