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