2015-09-09 40 views
1

我正在構建一個系統來跟蹤資產並對其進行建模。 基本上,問題是由於所有資產都具有一些共同屬性(如inventoryID,purchaseDate,Notes,Location等)以及它們自己的屬性(取決於我們要去的細節級別)的事實。因此,例如我們有打印機和電腦 - 顯然它們有共同的和特定的屬性。導軌設備/資產/庫存建模

我現在正在摸索我的頭如何處理這種關係的建模並儘可能優化它。

STI太麻煩了,甚至沒有考慮到。 我的其他選擇是什麼? 我正在研究如何用多態關聯來做到這一點,但我不確定這是做到這一點的正確方法。

我想在這樣的:沿着這條道路

Inventory has_many: :computers, as: :asset (common attributes) 
Inventory has_many: :printers, as: :asset (common attributes) 

Computer belongs_to: :asset, polymorphic (specific attributes) 
Printer belongs_to: :asset, polymorphic (specific attributes) 

東西...

我不知道這甚至有可能,似乎陰暗的我。 那麼,最好的方法是什麼?

+0

STI爲什麼凌亂?在我看來,這是解決您的問題的好方法。 STI在Rails中非常簡單。 – dimakura

+0

由於N個記錄上有N個未使用的字段,我看到它很混亂。當數據量很大時,將它分成多個表格會更好嗎? –

+0

是的,如果有很多不同的領域,STI不是最好的選擇。但是,如果模型之間的偏差不是太大,STI是很好的。 – dimakura

回答

1

有幾種方法可以解決您的問題。

  1. 第一個是你提到的STI。不錯,如果「資產」類型相對較少,並且不會偏離基本對象。它已經包含在Rails中。不過,正如你所說,這不是一個可以接受的方法。
  2. 第二種方法是使用MTI(多表繼承)。在這種方法中,我們有一個基本表(帶有共享字段),子類表與這個主表相關。您可以使用active_record-acts_as寶石,這使得使用MTI變得簡單。
  3. 還有一種方法。通過使用無模式數據庫,它可以「實時」創建字段。例如,通過使用Mongoid gem(適用於MongoDB),您可以輕鬆擴展模型。更多詳情here
+0

感謝您的回覆。 MTI看起來很有希望,但我確實有另一個相關的問題。我想達到的目的是能夠添加新的資產,我認爲它是計算機類型的,同時仍然將數據分成表格。有了提到的MTI寶石,我看到我可以創建一種類型的產品,它也會自動創建母體產品。 我會如何處理動態表單,就像我想要的那樣? –