2015-03-02 242 views
0

在rails web應用中,用戶可以「製作」Document。有文件不同的類型:Rails不同類型的模型有不同的字段數和字段類型

  1. Loan
  2. Business
  3. Insurance

每種類型的文檔都會有中常見的這種有些事情:account_numdoc_id,至少1name,但他們有不同的屬性。

例如:

Loan僅與loan_type場DOC

Business文檔可以1+name屬性

如果這些文檔可能有不同數量的屬性,做他們需要的是完全單獨的model s,或者是否有一種方法來合併的doc_type屬性,然後揭示哪些屬性與多少屬性相關聯e Document?如果是這樣,那會是什麼樣子?

回答

1

你所描述的是在Rails中single-table inheritance的明確目的。

使用一個表與所有模型中所有字段的超集。添加一個type列,然後創建你的三個模型,從一個基礎模型繼承,並且你完成了很多工作。

+0

啊所以表中的字段數將是任何一種類型所需的最大數量,對嗎?那麼對於不需要所有字段的類型,那些將只是空白或「空」? – mmcrae 2015-03-02 23:53:25

+0

我是否與我在評論中的猜測不符? – mmcrae 2015-03-03 01:31:48

+0

我得到STI會如何幫助我,但我真的不喜歡它是如何非標準化的... – mmcrae 2015-03-05 23:16:57

1

取決於你將需要什麼,但一般情況下,如果你的模型具有很強的通用性,即部分可以全部在同一個表中,並且包括指定類名的類型列。這被稱爲單表繼承。

模型之間的任何差異給你一些有趣的選擇。如果只有少數差異,則列可以簡單地包含在內。如果存在多個或所涉及的列可能只是稀疏填充,則可以爲屬於其中一個模型的額外列引入一個新表。例如,您可以爲企業創建一個alternate_names表。

class AlternateNames < ActiveRecord::Base 
    belongs_to :business 
end 

在你不需要的額外數據搜索不太可能的情況下,你甚至可以把它在同一個表,一個叫列類似extra_data,並序列附加屬性的哈希值。每個班級都可以適當地處理這些數據。

class Document < ActiveRecord::Base 
    # your code 
    serializes :extra_data 
end 

class Business < Document 
    def names 
    [name] + extra_data[:names] 
    end 
end 
+0

感謝您的回答,關於'extra_data'的一點。至於性病,我真的不喜歡它是如何非標準化。你知道如何在不使用STI的情況下做到這一點嗎?即使用'DocumentType'表或其他...我有點不知所措 – mmcrae 2015-03-05 23:18:16

+0

實施適當的STI,它應該結束更加規範化 - 共同的東西都在同一個表/類(文檔)中,然後像BusinessData這樣的表將會有一個document_id,belongs_to一個商業,並有任何額外的列你需要它。 Business類將具有訪問特殊數據的方法,但依靠Document來訪問公共數據。 – 2015-03-06 20:18:51

+0

實施適當的STI,它應該結束更加規範 - 共同的東西都在同一個表/類(文檔)中,然後一個表,如BusinessData將有一個document_id,belongs_to一個商業,並有你需要的任何額外的列。 Business類將具有訪問特殊數據的方法,但依靠Document來訪問公共數據。 – 2015-03-06 20:18:51

相關問題