La herencia de padres MongoMapper
-
18-09-2019 - |
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?
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?">]