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?

Foi útil?

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?">]
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top