2010-01-04 172 views
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 

當我運行以下命令時,它們不會完全返回我所期望的。

>> 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,則會返回該物品。你明白我的意思嗎?

我誤解了這裏的繼承是如何工作的?如果我是複製這種行爲的最佳方式是什麼?我試圖按照this(第2點)作爲我想要這項工作的指導原則。我假設他可以運行Link.all來查找所有鏈接,並且不包括從Item繼承的其他每個類。我錯了嗎?

回答

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 

和您的搜索的輸出(假設您創建了一個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?">] 
+0

太謝謝你了。說起來很沮喪! – Garrett 2010-01-06 22:14:04