2011-08-26 46 views
1

這個問題涉及到使用Ruby on Rails 3與MongoMapper和EmbeddedDocument。此外,ManyAssociation。在設計MongoMapper模型時有沒有嵌入類的(代碼設計)原因?

http://mongomapper.com/documentation/embedded-document.html

的MongoMapper的例子(在上面的鏈接)顯示出兩個獨立的類:

class Order 
    include MongoMapper::Document 

    many :line_items 
    timestamps! 
end 

class LineItem 
    include MongoMapper::EmbeddedDocument 

    key :name, String 
    key :quantity, Integer 
end 

但這種污染與LineItem全局命名空間。出於上下文的考慮,LineItem是什麼?如果我想要另一個模型,比如WishList,還有一個LineItem集合?

因此,有可能嵌入LineItem類的秩序,就像這樣:

class Order 
    include MongoMapper::Document 

    many :line_items, :class_name => "Order::LineItem" 
    timestamps! 

    class LineItem 
    include MongoMapper::EmbeddedDocument 

    key :name, String 
    key :quantity, Integer 
    end 
end 

雖然這可能是技術上的罰款(是嗎?),稍後我會遇到設計問題?它是否使代碼太醜陋?太複雜了?

大概,這種Ruby語言的存在意味着有人認爲這是一個好主意?

我一直很喜歡Django的一件事是它如何使用「應用程序」來分組相關模型類(並分隔名稱空間)。所以我上面的代碼也在Rails中實現。

回答

3

我沒有看到任何方法的技術問題。我碰到的問題是,當一個類嵌入到它的父代中,並且也在同一個文件中時,我會忘記它在那裏。所以如果你的命名空間爲Order::LineItem,你可以在你的「models」文件夾中創建一個「訂單」文件夾,並在其中放入「line_item.rb」。

另一個問題是,如果你想有一個控制器Order::LineItem,你還必須命名空間,並把它的文件夾中,並在路由器它看起來就像:

resource :orders do 
    resources :line_items,   :controller => "order/line_items" 
end 

除非你知道你的應用將有多種類型的line_items,我建議不要命名空間 - 如果你做了,你可能會過度編碼。例如,如果您稍後需要兩種類型的line_items,您甚至可能會發現某些代碼可能會在模型之間重複使用 - 如果命名空間爲第一個line_item,則可能會發現您將其命名爲空間。

在Python中,命名空間被認爲是一件好事,應該有更多的命名空間。但是當您考慮Rails應用程序的全局命名空間時,它並不是那麼混亂。 Gem作者非常擅長將他們的所有類命名空間保留在他們的一個gem模塊中,因此在Rails應用中,您將爲每個您使用的gem擁有一個命名空間(Rails本身是5個gem,不知道有多少個全局常量),加上一些Rails包含的文件(例如SecureRandom)。事實證明,將這些文件「恰到好處」真的很好,而且我在實踐中發現命名空間衝突很少,您可以輕鬆解決它們。我只碰到過一次命名空間問題,但有幾次我偶然在模型上定義了一個「發送」方法,這是一個更常見的類似影響的問題。