单一 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 而不是使用继承可能会更好。
我在使用单个 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 而不是使用继承可能会更好。