Rails不同类型的模型具有不同数量和类型的字段

时间:2015-03-02 23:15:04

标签: ruby-on-rails model-view-controller database-design

在rails web app中,用户可以"制作"一个Document。有不同类型的文件:

  1. Loan
  2. Business
  3. Insurance
  4. 每种类型的文档都会有一些共同点,例如:account_numdoc_id,至少1 name,但是他们有不同的属性。

    例如:

    Loan只是带有loan_type字段的文档

    Business个文档可以包含1+ name个属性

    如果这些文档可能包含不同数量的属性,那么它们是否需要完全独立model,或者是否有一种方法可以为doc_type添加Document属性,然后显示什么,以及多少属性与Document相关联?如果是这样,那会是什么样的?

2 个答案:

答案 0 :(得分:1)

您所描述的是Rails中single-table inheritance的明确目的。

使用一个表格,其中包含所有模型中所有字段的超集。添加type列,然后创建三个模型,从基础模型继承,并且您已经完成了很多工作。

答案 1 :(得分: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