我正在开展一个用户可以拥有多个客户端的项目。这些客户可以是Person或Business类型。
我倾向于使用STI的想法,但我不确定这是否是正确的方法,因为我的模型不会共享相同的属性。
例如,企业有一个legal_form,其中一个人可能有一个marital_status。
在这种特殊情况下使用STI是否可以,或者(第二个问题)是否允许rails为每种类型使用单独的表。
答案 0 :(得分:1)
STI就像红宝石中的继承。如果您有父和孩子,则可以使用它,并且它们共享许多属性和数据。如果Person
和Business
共享很多,您可以使用它。否则,我建议您使用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
我don't really like STI和我建议您尝试使用多态关联。
STI的常见问题
STI的一个常见问题是,随着时间的推移,会添加更多类型 那个表,它增长了越来越多的列,并且记录在 桌子彼此之间的共同点越来越少。每种类型 record使用表的列的某个子集,而没有使用全部的列 他们,所以你最终得到一个人口稀少的桌子。那些类型 为彼此创造成本:当您查询文章时,您必须 记得过滤掉所有其他类型的值,并且仅过滤掉 选择与文章相关的列,或者付出巨大的表现 成本。如果,您可以重现数据库为您做的大量工作 你只有自己的表中的每种数据类型。