我试图使用类继承与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列表中的所有结果,所以包含自身PictureVideo。但是,如果该项目实际上是一个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?">]
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top