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?

War es hilfreich?

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?">]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top