首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails STI设计问题

Rails STI设计问题
EN

Stack Overflow用户
提问于 2015-09-20 20:16:19
回答 2查看 374关注 0票数 1

我正在做一个副项目,其中一个用户可以有多个客户。这些客户端可以是Person或Business类型。

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

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

在这种情况下使用STI可以吗?或者(第二个问题)有没有办法允许rails对每种类型使用不同的表。

EN

回答 2

Stack Overflow用户

发布于 2015-09-20 20:33:50

STI就像ruby中的继承。如果您有父对象和子对象,并且它们共享大量属性和数据,则可以使用它。如果PersonBusiness有很多共同之处,你可以使用它。否则,我建议您使用Polymorphic Associations

关于关联的一个稍微高级的特性是多态关联。使用多态关联,一个模型可以属于单个关联上的多个其他模型。例如,您可能有一个属于员工模型或产品模型的图片模型。这是如何声明的:

代码语言:javascript
复制
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

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

STI的常见问题:

STI的一个常见问题是,随着时间的推移,添加到该表中的类型会越来越多,并且它会增长越来越多的列,并且表中的记录彼此之间的共同点越来越少。每种类型的记录都使用表中列的某个子集,而没有一个会使用所有列,因此最终得到的是一个填充非常稀疏的表。这些类型会相互产生成本:当您查询文章时,必须记住过滤掉所有其他类型的值,并且只选择与文章相关的列,否则将付出巨大的性能成本。如果只将每种数据类型放在各自的表中,则可以重复数据库为您执行的大量工作。

票数 1
EN

Stack Overflow用户

发布于 2015-09-20 23:50:01

假设我使用多态关联,这是正确的吗

代码语言:javascript
复制
class Client < ActiveRecord::Base
  belongs_to :cliental, polymorphic: true
end

class Business < ActionRecord::Base
  # Here I am using has_one because I do not want to have duplicates
  has_one :client, as: :cliental
end

 class Person < ActionRecord::Base
  # Here I am using has_one because I do not want to have duplicates
  has_one :client, as: :cliental
end

稍后我想做以下几件事

代码语言:javascript
复制
class User < ActiveRecord::Base
  has_many clients
  has_many businesses, through: :client
  has_many people, through: :client
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32679307

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档