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?

È stato utile?

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?">]
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top