2008-09-15 69 views
8

RoR教程爲每個表定位一個模型,以使ORM正常工作。 我的數據庫架構有一些70臺概念分爲5組的功能 (例如,任何給定的表生活在一個和唯一一個官能團,和不同羣體的表之間的關係被最小化。) 所以:我應該設計一個模型每個概念組,還是我應該只有70個Rails模型,並將這個分組「概念化」? 謝謝!Ruby on Rails中模型設計的最佳實踐

回答

8

我在大的應用程序之一的只是確保表/模型概念由名稱分組(1臺模型關係幾乎1)覆蓋這一點。例如:

events 
event_types 
event_groups 
event_attendees 
etc... 

當我使用的TextMate或任何這樣的模型文件是很好的阿爾法排序組合在一起。我在這個應用程序中有80個模型,並且它可以很好地保持組織結構。

+0

當然,這可以很好地解決問題。謝謝! – NickR 2008-09-23 11:16:14

10

最有可能的是,你應該有70個型號。你可以命名空間模型有5個命名空間,每個組有一個命名空間,但這可能比它的價值更麻煩。更有可能的是,你在每個組中都有一些共同的功能。在這種情況下,我會爲每個包含其行爲的組創建一個模塊,並將其包含在每個相關模型中。即使沒有共享功能,這樣做可以讓您快速查詢其概念組的模型。

+0

謝謝!突然間我明白了爲什麼我想要使用模塊。關閉做更多的閱讀.. – NickR 2008-09-15 13:36:25

6

你絕對應該使用每個表中的一個模式,以利用所有ActiveRecord的魔法優勢。

但你也可以組你的模型一起到使用模塊和子目錄,以避免在您的模型目錄來管理70個文件的命名空間。

例如,你可以有:

app/models/admin/user.rb 
app/models/admin/group.rb 

適用機型管理員::用戶和管理員::集團,和

app/models/publishing/article.rb 
app/models/publishing/comment.rb 

爲出版::文章和出版::評論

等等......

+0

謝謝!子目錄/名稱空間是一個很好的解決方案。 Nick – NickR 2008-09-15 13:37:33

1

可能有少數情況下,您可以使用Rails標準rd單表繼承模型。也許一個特定功能分組中的所有類都具有相同的字段(或幾乎全部相同)。在這種情況下,請利用DRYness STI優惠。但是,當它沒有意義時,請使用每個表類。

在課堂上,每個表的版本,你不能輕易拉共同的功能集成到一個基類。相反,將其拉入模塊。像下圖的層次結構可能證明是有用的:

app/models/admin/base.rb - module Admin::Base, included by all other Admin::xxx 
app/models/admin/user.rb - class Admin::User, includes Admin::Base 
app/models/admin/group.rb - class Admin::Group, includes Admin::Base 
4

,無需瞭解七十表及其概念關係它是不是真的能夠給出很好的答案的性質的更多細節。這些遺留表格還是您從頭開始設計的?

這些表是通過某種繼承模式相關還是它們可以? Rails可以做有限的繼承。查找單表繼承(STI)。

就個人而言,我會付出很多努力避免使用七十張表,因爲這是一個非常多的工作 - 七十個模型&控制器及其4+視圖,助手,佈局和測試,更不用說記憶加載問題保持設計不變。當然,除非我在一小時內得到報酬,並且足以補償重複。

1

它已經提到的,很難不知道你的數據庫結構等給予像樣的建議,不過,我會向精益創造70+模型,(一個爲每個表。)

您可能能夠逃脫開溝一些模型,但對於成本(negliable)你可能也有他們那裏。

你並不需要創建一個控制器+視圖每個模型(如srboisvert answerd)。你只需要每個資源的控制器(根據你的描述,我預計它會少於70個 - 大概只有10或15個左右)。

4

之前,在製作70款跳,請考慮這個問題,以幫助您決定:

會每個表的被認爲是一個「對象」例如「汽車」表或一些表的持只有關係信息,例如所有外鍵列?

在Rails中,只有「對象」表變成了模型! (對於特定類型的關聯有一些例外)所以很可能如果你只有5組功能,你可能沒有70個模型。另外,如果你提到的功能組有很大不同,它們甚至可能最適合他們自己的應用程序。