代码之家  ›  专栏  ›  技术社区  ›  Garrett

MongoMapper父继承

  •  7
  • Garrett  · 技术社区  · 15 年前

    我正试图通过将类继承与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.all Video.all . 你明白我的意思吗?

    this (第2点)作为我希望这项工作的指导方针。我想他能跑 Link.all 查找所有链接,而不包括继承自的所有其他类 Item . 我错了吗?

    1 回复  |  直到 15 年前
        1
  •  10
  •   Emily    15 年前

    您链接到的示例有点误导(或者很难理解),因为它没有显示 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?">]
    
    推荐文章