Pergunta
Eu estou tentando obter um resultado melhor e organizado de usar a herança de classe com MongoMapper, mas tendo alguns problemas.
class Item
include MongoMapper::Document
key :name, String
end
class Picture < Item
key :url, String
end
class Video < Item
key :length, Integer
end
Quando eu execute os seguintes comandos, eles não muito voltar o que eu estou esperando.
>> 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?">]
Eles são todos o mesmo resultado, eu esperaria ter lista Item.all
todos os resultados, por isso, incluindo o próprio, Picture
e Video
. Mas se o item é realmente uma Picture
, gostaria que ele seja devolvido se eu corri Picture.all
e não se eu executar Video.all
. Você vê o que eu quero dizer?
Am I mal-entendido como a herança funciona aqui? Se eu sou o que é a melhor maneira de replicar esse tipo de comportamento? Estou tentando seguir este (ponto 2) como uma diretriz de como eu quero que este trabalho. Presumo que ele pode executar Link.all
para encontrar todos os links, e não incluem todas as outras classes que herda de Item
. Estou errado?
Solução
O exemplo que você conectar-se a é um pouco enganador (ou talvez apenas difícil de seguir) em que ele não mostra a definição completa para o modelo Item
. A fim de usar a herança em seus modelos, você precisa definir uma _type
chave no modelo de pai. MongoMapper programa então automaticamente essa chave para o nome da classe da classe real desse documento. Assim, por exemplo, você modelos iria ficar assim:
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 a saída de suas pesquisas (supondo que você criou um objeto Picture
) vai se transformar em:
>> 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?">]