2010-01-04 4 views
7

Ich versuche, ein besseres und organisierteres Ergebnis zu erhalten, indem ich die Klassenvererbung mit MongoMapper verwende, aber einige Probleme habe.MongoMapper Elternvererbung

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, geben sie nicht ganz zurück, 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, würde ich Item.all Liste alle Ergebnisse erwarten haben, so mit sich, Picture und Video. Aber wenn der Artikel tatsächlich eine Picture ist, möchte ich es zurückgegeben, wenn ich Picture.all lief und nicht, wenn ich Video.all ausführen. Verstehst du, was ich meine?

Bin ich falsch verstanden, wie die Vererbung hier funktioniert? Wenn ich bin, was ist der beste Weg, um diese Art von Verhalten zu replizieren? Ich versuche, this (Punkt 2) als eine Richtlinie zu folgen, wie ich diese Arbeit will. Ich nehme an, er kann Link.all laufen lassen, um alle Verbindungen zu finden, und nicht jede andere Klasse einschließen, die von Item erbt. Liege ich falsch?

Antwort

10

Das Beispiel, zu dem Sie verlinken, ist ein wenig irreführend (oder vielleicht nur schwer zu folgen), weil es nicht die vollständige Definition für das Item Modell zeigt. Um die Vererbung in Ihren Modellen zu verwenden, müssen Sie im übergeordneten Modell einen Schlüssel _type definieren. MongoMapper wird dann diesen Schlüssel automatisch auf den Klassennamen der aktuellen Klasse dieses Dokuments setzen. So zum Beispiel, würden 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?">] 
+0

Sie so viel Dank. War ziemlich frustrierend, gelinde gesagt! – Garrett

Verwandte Themen