单表继承轨道模型可以表现为不同类型

时间:2015-10-05 02:42:51

标签: ruby-on-rails polymorphism data-modeling single-table-inheritance

我遇到单表继承(STI)数据模型的问题,其中模型可以是类型OR之一。我可以添加第三种类型,类似于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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

module Trader
  extend ActiveSupport::Concern
  has_many :trading_companies
end

class TradingCompanyAndClearingMember < Company
  include Trader
end


class ClearingMember < Company
  include Trader
end