1

我在单个表继承(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 

回答

3

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

+0

将使用AR关注的想法,并将共享行为放在那些干燥的东西。感谢您的反馈! – daino3

1

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

module Trader 
    extend ActiveSupport::Concern 
    has_many :trading_companies 
end 

class TradingCompanyAndClearingMember < Company 
    include Trader 
end 


class ClearingMember < Company 
    include Trader 
end