【问题标题】:Single Table Inheritence rails model that can behave as different types可以表现为不同类型的单表继承导轨模型
【发布时间】:2016-01-01 15:13:58
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 将使用 AR 关注点的概念并将共享行为放入其中以干燥一些东西。感谢您的反馈!
    【解决方案2】:

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

    module Trader
      extend ActiveSupport::Concern
      has_many :trading_companies
    end
    
    class TradingCompanyAndClearingMember < Company
      include Trader
    end
    
    
    class ClearingMember < Company
      include Trader
    end
    

    【讨论】:

      猜你喜欢
      • 2012-09-20
      • 1970-01-01
      • 1970-01-01
      • 2012-07-21
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      • 2019-12-04
      • 1970-01-01
      相关资源
      最近更新 更多