题
我试图使用类继承与MongoMapper获得更好的和有组织的结果,但遇到一些麻烦。
class Item
include MongoMapper::Document
key :name, String
end
class Picture < Item
key :url, String
end
class Video < Item
key :length, Integer
end
当我运行下面的命令,它们不会回到我所期待的。
>> 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?">]
他们都是同样的结果,我希望有Item.all
列表中的所有结果,所以包含自身Picture
和Video
。但是,如果该项目实际上是一个Picture
,我想它,如果我跑Picture.all
和返回要是我跑Video.all
。你明白我的意思吗?
我误解的继承是如何工作的吗?如果我什么是复制这种行为的最好方法?我想跟随的这(2点)作为我多么希望这个工作很有指导意义。我认为他可以运行Link.all
找到所有的链接,而不是包括从Item
继承所有其他类。难道我错了吗?
解决方案
您链接到的例子是有点误导(或者只是难走),因为它不显示为Item
模型的完整定义。为了在您的模型使用继承,你需要定义父模型的关键_type
。然后MongoMapper将自动设置键,实际的类文件的类名。所以,举例来说,您模型将现在看起来是这样的:
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
和您的搜索的输出(假设你创建对象Picture
)将变成:
>> 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?">]
不隶属于 StackOverflow