Pregunta

Estoy tratando de obtener un resultado mejor y organizada del uso de la herencia de clases con MongoMapper, pero teniendo algunos problemas.

class Item
  include MongoMapper::Document

  key :name, String
end

class Picture < Item
  key :url, String
end

class Video < Item
  key :length, Integer
end

Al ejecutar los comandos siguientes, que no vuelven bastante lo que estoy 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?">]

Son todos el mismo resultado, esperaría tener lista Item.all todos los resultados, por lo que incluir en sí, Picture y Video. Sin embargo, si el artículo es en realidad un Picture, me gustaría que se devolverá si corría Picture.all y si no corro Video.all. ¿Ves lo que quiero decir?

¿Estoy mal entendido cómo funciona la herencia aquí? Si soy lo que es la mejor manera de replicar este tipo de comportamiento? Estoy tratando de seguir esta (punto 2) como una guía de cómo quiero este trabajo. Asumo que puede correr Link.all para encontrar todos los enlaces, y no incluir cualquier otra clase que hereda de Item. ¿Me equivoco?

¿Fue útil?

Solución

El ejemplo que enlace a es un poco engañoso (o tal vez sólo difícil de seguir), ya que no muestra la definición completa para el modelo Item. Con el fin de utilizar la herencia en sus modelos, tendrá que definir un _type clave en el modelo de los padres. MongoMapper entonces fijará automáticamente que la clave para el nombre de clase de la clase real de dicho documento. Así, por ejemplo, que los modelos ahora tendría el siguiente aspecto:

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

y la salida de las búsquedas (suponiendo que ha creado un objeto Picture) se convertirá en:

>> 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top