单一 Table 继承 rails 模型,可以表现为不同的类型

Single Table Inheritence rails model that can behave as different types

我在使用单个 table 继承 (STI) 数据模型时遇到问题,其中模型可以是其中一种类型,也可以是两种类型。我可以添加第三种类型,类似于 TradingCompanyClearingMember 但我需要将两个模型的代码复制到第三个模型中。这变得特别困难的地方是定义多态关系。是否有更简单/更好的方法/替代方案来考虑对这种行为进行建模?

class Company < ActiveRecord::Base
  validates :type, inclusion: %w(TradingCompany ClearingMember TradingCompanyAndClearingMember)
end

class TradingCompany < Company
  has_many :traders, as: :tradeable
  belongs_to :clearing_member
end

class ClearingMember < Company
  has_many :trading_companies
  has_many :contacts
end

class TradingCompanyAndClearingMember < Company
  # copied clearing member relationships
  has_many :trading_companies
  has_many :contacts
  # copied trading company relationships
  has_many :traders, as: :tradeable
  belongs_to :clearing_member
end

class Trader
  belongs_to :tradeable, polymorphic: true
end

您可以创建一个关注点模块并将其包含在您需要的模型中。

module Trader
  extend ActiveSupport::Concern
  has_many :trading_companies
end

class TradingCompanyAndClearingMember < Company
  include Trader
end


class ClearingMember < Company
  include Trader
end

ruby 最接近多重继承的是混合模块。您可以将 TradingCompany 代码放入 TradingCompanyModule 中,然后将其导入到两种贸易公司类型 类 中。但我认为让 Company 拥有一个 TradingCompany 和一个 ClearingMember 而不是使用继承可能会更好。