2010-01-04 22 views
7

Estoy tratando de obtener un resultado mejor y más organizado del uso de la herencia de clases con MongoMapper, pero tengo algunos problemas.MongoMapper Parent Herencia

class Item 
    include MongoMapper::Document 

    key :name, String 
end 

class Picture < Item 
    key :url, String 
end 

class Video < Item 
    key :length, Integer 
end 

Cuando ejecuto los siguientes comandos, no devuelven exactamente lo que esperaba.

>> 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?">] 

todos son el mismo resultado, esperaría tener Item.all lista de todos los resultados, por lo que incluir en sí, Picture y Video. Pero si el artículo es en realidad un Picture, me gustaría que se devuelva si ejecuté Picture.all y no si ejecuto Video.all. ¿Ves lo que quiero decir?

¿Entiendo mal cómo funciona la herencia aquí? Si yo soy, ¿cuál es la mejor manera de replicar este tipo de comportamiento? Intento seguir this (punto 2) como una guía de cómo quiero que funcione. Supongo que puede ejecutar Link.all para encontrar todos los enlaces y no incluir todas las demás clases heredadas del Item. ¿Me equivoco?

Respuesta

10

El ejemplo al que se vincula es un poco engañoso (o tal vez simplemente difícil de seguir) ya que no muestra la definición completa para el modelo Item. Para utilizar la herencia en sus modelos, deberá definir una clave _type en el modelo principal. MongoMapper luego establecerá automáticamente esa clave para el nombre de clase de la clase real de ese 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?">] 
+0

Muchas gracias. Fue bastante frustrante por decir lo menos! – Garrett