Domanda
Sto cercando di ottenere un risultato migliore e organizzato da utilizzare classe eredità con MongoMapper, ma avendo qualche problema.
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 la lista Item.all
tutti i risultati, così incluso se stesso, Picture
e Video
. Ma se l'articolo è in realtà un Picture
, vorrei che deve essere restituito se mi sono imbattuto Picture.all
e non se corro Video.all
. Capisci cosa voglio dire?
Sto equivoco come l'eredità lavora qui? Se io sono quello che è il modo migliore per replicare questo tipo di comportamento? Sto cercando di seguire questo (punto 2) come guida di come voglio che questo lavoro. Presumo può correre Link.all
per trovare tutti i link, e non includere ogni altra classe che eredita da Item
. Mi sbaglio?
Soluzione
L'esempio si collega a è un po 'fuorviante (o forse solo difficile da seguire), in quanto non mostra la definizione completa per il modello Item
. Per poter utilizzare l'ereditarietà nei modelli, è necessario definire una _type
chiave sul modello genitore. MongoMapper sarà quindi impostare automaticamente che la chiave per il nome di classe della classe effettiva di tale 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?">]