2011-05-18 80 views
5

因此,這可能是一個相當容易回答的問題,但無論如何這裏都是如此。Rails 3.0 - 最佳實踐:模型對象的多個子類型

我想要這個視圖,說media_objects /顯示媒體對象的列表。很簡單,對嗎?但是,我希望媒體對象列表成爲MediaObject,CDMediaObject,DVDMediaObject的子類型的集合。這些子類型中的每一個都需要用一個數據庫表來表示,這些元數據在子類型中並不完全共同。

我的第一次傳遞是爲每個子類型創建一個模型,將MediaObject更改爲足夠聰明,以便將這些表加入概念上的「全部」行爲。這看起來很直截了當,但我最終做了很多小事情,覺得不那麼重要,所以我想在這裏尋求建議。

我沒有在這個例子中的任何具體的代碼,但很明顯,但如果你有任何問題,我會很樂意編輯這個問題提供信息...

的感謝!

回答

7

爲每個子類型創建一個模型是一種可行的方法,但是你所談論的是多表繼承。 Rails假定單表繼承,併爲設置它提供了非常簡單的支持。將列添加到media_objects表中,並將每種特定類型MediaObject的所有列添加到表中。然後,讓你的每一個型號的MediaObject子類:

class MediaObject < ActiveRecord::Base 

end 

class CDMediaObject < MediaObject 

end 

Rails會處理拉動記錄了和實例正確的子類,所以,當你MediaObject.find(:all)結果將包含各種子類的實例的混合物MediaObject

注意這不符合您的要求:需要

每個亞型與特定的元數據集的數據表,是不是整個亞型完全共同表示。

Rails是所有關於約定優於配置,它會讓你的生活非常簡單,如果你寫你的應用程序,以它的長處,而不是預期的Rails,以適應您的需求。是的,STI會浪費空間,留下一些沒有填充每個記錄的列。你應該在乎嗎?可能不會;數據庫存儲很便宜,如果重要的列有索引,額外的列不會影響查找性能。

也就是說,你可以設置something very close多表繼承,但你可能不應該。

+0

優秀!我很懷疑,也許我正試圖讓Ruby脫離軌道。稀疏的元數據方法使我的敏感性受到了影響,但我發現很多我以前存在的「敏感性」在RoR中被提出質疑。我正在學習和發展:) – jaydel 2011-05-18 13:32:11

+0

Rails是一款自以爲是的軟件。對於他們假定的違約情況,我也有很多疑慮,特別是在涉及外鍵約束等事情時。但是,現在有一段時間,你必須決定提高工作效率,並且放下個人偏見來完成工作:) – meagar 2011-05-18 13:45:22

0

我想說,這取決於您的數據:例如,如果特定媒體對象之間的差異不必可搜索,則可以使用帶有TEXT列的單個數據庫表,稱爲「additional_attributes」。使用rails,您可以將任意數據序列化到該列中。

如果你不能這樣做,你可以有一個「有一個:數據集」的一般表「media_objects」。在數據集中,您可以存儲CDMediaObject,DVDMediaObject等之間的細節。

完全不同的方法是使用MongoDB(而不是MySQL),這是一個文檔存儲。每個文件可以有一個完全不同的形式。整個文檔樹也是可搜索的。

0

我知道這個問題很老,但只是放下我的想法,如果有人在這裏登陸。

如果數據庫是postgres,我會建議沿着hstore列使用STI來存儲不同對象間不常見的屬性。這將避免在數據庫中浪費空間,但可以爲不同的操作訪問屬性。