MongoMapper Elternteil Vererbung
-
18-09-2019 - |
Frage
Ich versuche, ein besseres und organisierte Ergebnis zu erhalten verwendet Klassenvererbung mit MongoMapper, aber einige Probleme habe.
class Item
include MongoMapper::Document
key :name, String
end
class Picture < Item
key :url, String
end
class Video < Item
key :length, Integer
end
Wenn ich die folgenden Befehle ausführen, sie nicht ganz zurückgeben, was ich erwarte.
>> 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?">]
Sie sind alle das gleiche Ergebnis sind, würde ich erwarten, Item.all
Liste alle Ergebnisse haben, also einschließlich sich selbst, Picture
und Video
. Aber wenn das Element tatsächlich ein Picture
ist, würde Ich mag es zurückgeschickt werden, wenn ich Picture.all
lief und nicht, ob ich laufen Video.all
. Siehst du, was ich meine?
Bin ich Missverständnis, wie die Vererbung hier funktioniert? Wenn ich, was bin, ist der beste Weg, diese Art von Verhalten zu replizieren? Ich versuche, diese (Punkt 2) als Richtschnur dafür, wie ich diese Arbeit will. Ich nehme an, er Link.all
laufen alle Links zu finden, und nicht jede andere Klasse gehören, die von Item
erbt. Bin ich falsch?
Lösung
Das Beispiel, das Sie verknüpfen, ist ein wenig irreführend (oder vielleicht auch nur schwer zu folgen), dass sie die vollständige Definition für das Item
Modell nicht zeigen. Um Vererbung in Ihren Modellen zu verwenden, benötigen Sie einen Schlüssel _type
auf dem übergeordneten Modell zu definieren. MongoMapper wird dann automatisch diesen Schlüssel auf die Klassennamen der tatsächlichen Klasse des Dokuments festgelegt. So zum Beispiel, Sie Modelle nun wie folgt aussehen:
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
und die Ausgabe Ihrer Suche (vorausgesetzt, Sie ein Picture
Objekt erstellt) wird sich in:
>> 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?">]