MongoMapper父继承

Gar*_*ett 7 mongomapper

我试图通过使用MongoMapper的类继承来获得更好的组织结果,但是遇到了一些麻烦.

class Item
  include MongoMapper::Document

  key :name, String
end

class Picture < Item
  key :url, String
end

class Video < Item
  key :length, Integer
end
Run Code Online (Sandbox Code Playgroud)

当我运行以下命令时,它们并没有完全返回我期望的内容.

>> 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?">]
Run Code Online (Sandbox Code Playgroud)

它们都是相同的结果,我希望Item.all列出所有结果,所以包括它自己Picture,和Video.但是,如果该项目实际上是一个Picture,我希望如果我跑,我会退回,如果我跑Picture.all,我不想Video.all.你明白我的意思吗?

我是否误解了继承在这里的作用?如果我是复制这种行为的最佳方式是什么?我试图按照这一点(第2点)作为我想要这项工作的指导方针.我假设他可以运行Link.all以查找所有链接,而不包括继承自的所有其他类Item.我错了吗?

Emi*_*ily 10

您链接到的示例有点误导(或者可能很难遵循),因为它没有显示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
Run Code Online (Sandbox Code Playgroud)

并且您的搜索输出(假设您创建了一个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?">]
Run Code Online (Sandbox Code Playgroud)