我正在做一个副项目,其中一个用户可以有多个客户。这些客户端可以是Person或Business类型。
我倾向于使用STI的想法,但我不确定这是不是正确的方式,因为我的模型将不会共享相同的属性。
例如,企业有一个legal_form,其中一个人可能有一个marital_status。
在这种情况下使用STI可以吗?或者(第二个问题)有没有办法允许rails对每种类型使用不同的表。
发布于 2015-09-20 20:33:50
STI就像ruby中的继承。如果您有父对象和子对象,并且它们共享大量属性和数据,则可以使用它。如果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

I don't really like STI和我建议你尝试使用多态关联。
STI的常见问题:
STI的一个常见问题是,随着时间的推移,添加到该表中的类型会越来越多,并且它会增长越来越多的列,并且表中的记录彼此之间的共同点越来越少。每种类型的记录都使用表中列的某个子集,而没有一个会使用所有列,因此最终得到的是一个填充非常稀疏的表。这些类型会相互产生成本:当您查询文章时,必须记住过滤掉所有其他类型的值,并且只选择与文章相关的列,否则将付出巨大的性能成本。如果只将每种数据类型放在各自的表中,则可以重复数据库为您执行的大量工作。
发布于 2015-09-20 23:50:01
假设我使用多态关联,这是正确的吗
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稍后我想做以下几件事
class User < ActiveRecord::Base
has_many clients
has_many businesses, through: :client
has_many people, through: :client
endhttps://stackoverflow.com/questions/32679307
复制相似问题