2015-03-02 144 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

相关问题