2010-01-04 2 views
7

Sto cercando di ottenere un risultato migliore e organizzato dall'utilizzo dell'ereditarietà della classe con MongoMapper, ma con qualche problema.Ereditarietà di MongoMapper

class Item 
    include MongoMapper::Document 

    key :name, String 
end 

class Picture < Item 
    key :url, String 
end 

class Video < Item 
    key :length, Integer 
end 

Quando eseguo i seguenti comandi, non del tutto restituiscono quello che mi aspetto.

>> 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?">] 

Sono tutti lo stesso risultato, mi sarei aspettato di avere Item.all lista di tutti i risultati, quindi incluso se stesso, Picture e Video. Ma se l'articolo è in realtà un Picture, vorrei che venga restituito se corro Picture.all e non se corro Video.all. Capisci cosa intendo?

Sto fraintendendo come funziona l'eredità qui? Se io sono qual è il modo migliore per replicare questo tipo di comportamento? Sto cercando di seguire this (punto 2) come linea guida su come voglio questo lavoro. Presumo che possa eseguire Link.all per trovare tutti i collegamenti e non includere ogni altra classe che eredita da Item. Ho sbagliato?

risposta

10

L'esempio a cui si fa riferimento è un po 'fuorviante (o forse solo difficile da seguire) in quanto non mostra la definizione completa per il modello Item. Per utilizzare l'ereditarietà nei modelli, è necessario definire una chiave _type sul modello principale. MongoMapper imposterà automaticamente quella chiave sul nome della classe della classe effettiva di quel documento. Così, per esempio, è modelli dovrebbe apparire così:

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 

e l'uscita delle tue ricerche (supponendo che si è creato un oggetto Picture) si trasformerà 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

grazie mille. Era piuttosto frustrante per non dire altro! – Garrett