我有n个代表订单的模型,例如EbayOrder
和AmazonOrder
。每个订单模型都有略微不同的字段,但它们都代表相同的基本事物,即订单。
问题是我经常需要查询我的所有订单,以便在视图中显示它们,添加费用和销售总额,并对它们执行其他分析。当模型是独立的实体时,这样做很棘手。
以下是我考虑的一些选项:
STI
STI表可能会有几十列宽。
保留单独的模型,但生成具有规范化数据的副本Order
模型
这将是一个奴隶“通用”模型,它将是每种类型订单的一对一复制品,但具有更多标准化的清洁数据。我不喜欢这个选项,因为需要重复数据。
将所有订单类型规范化为单个Order
模型
如果数据足够相似,那将是理想的,但它们在订单类型中差异很大。
答案 0 :(得分:0)
另一种选择是使用Polymorphic associations:
class Order < ApplicationRecord
belongs_to :specific, polymorphic: true, dependent: :destroy
end
class EbayOrder < ApplicationRecord
has_one :order, as: :specific
end
class AmazonOrder < ApplicationRecord
has_one :order, as: :specific
end
在Order
模型中,您可以保留共享属性,但对于自定义属性,您可以使用单独的模型。无论如何,这种方法使得查询数据库变得更加复杂。
此外,如果您使用Postgres,那么您可以查看另一种方法:将所有订单保留在一个表中,但为自定义属性创建JSON列。