Rails STI设计问题

时间:2015-09-20 12:16:19

标签: ruby-on-rails single-table-inheritance sti

我正在开展一个用户可以拥有多个客户端的项目。这些客户可以是Person或Business类型。

我倾向于使用STI的想法,但我不确定这是否是正确的方法,因为我的模型不会共享相同的属性。

例如,企业有一个legal_form,其中一个人可能有一个marital_status。

在这种特殊情况下使用STI是否可以,或者(第二个问题)是否允许rails为每种类型使用单独的表。

1 个答案:

答案 0 :(得分:1)

STI就像红宝石中的继承。如果您有孩子,则可以使用它,并且它们共享许多属性和数据。如果PersonBusiness共享很多,您可以使用它。否则,我建议您使用Polymorphic Associations

  

关联的稍微更高级的扭曲是多态的   协会。通过多态关联,模型可以属于更多   在一个协会上,而不是一个其他模型。例如,你可能   有一个图片模型属于员工模型或   产品型号。以下是如何宣布:

class Picture < ActiveRecord::Base
  belongs_to :imageable, polymorphic: true
end

class Employee < ActiveRecord::Base
  has_many :pictures, as: :imageable
end

class Product < ActiveRecord::Base
  has_many :pictures, as: :imageable
end

enter image description here

don't really like STI和我建议您尝试使用多态关联。

STI的常见问题

  

STI的一个常见问题是,随着时间的推移,会添加更多类型   那个表,它增长了越来越多的列,并且记录在   桌子彼此之间的共同点越来越少。每种类型   record使用表的列的某个子集,而没有使用全部的列   他们,所以你最终得到一个人口稀少的桌子。那些类型   为彼此创造成本:当您查询文章时,您必须   记得过滤掉所有其他类型的值,并且仅过滤掉   选择与文章相关的列,或者付出巨大的表现   成本。如果,您可以重现数据库为您做的大量工作   你只有自己的表中的每种数据类型。