首页 > 解决方案 > 在 Ruby on Rails 中将多态关联与 STI 或 MTI 混合

问题描述

在实现多态关联之后,我遇到了一个问题或困境所有代码都位于此处

我已经实现了这个模型:

模型

假设我还需要订阅杂志。它也将类似于其他两个

class Magazines < ApplicationRecord
  has_many :subscriptions, as: :subscribable
end

class User < ApplicationRecord
  has_many :subscriptions
  has_many :podcasts, through: :subscriptions, source: :subscribable, source_type: 'Podcast'
  has_many :newspapers, through: :subscriptions, source: :subscribable, source_type: 'Newspaper'
  has_many :magazines, through: :subscriptions, source: :subscribable, source_type: 'Newspaper'
end

class Subscription < ApplicationRecord
  belongs_to :subscribable, polymorphic: true
  belongs_to :user
end

效果很好,现在问题没问题,我可以处理三种类型的订阅 MagazineSubscription、PodcastSubscription 和 NewspaperSubscription。三者具有相同的属性和相同的行为,但属于不同的模型。如果这样做之后我需要某种带有订阅类的 MTI 或 STI 会发生什么。即 MagazineSubscription 有不同的行为,也许还有其他属性。有一种简单的方法可以完成这个新要求,例如创建一个处理所有多态关联和其他模型的 Subscription 类:

class Subscription < ActiveRecord::Base
  self.inheritance_column = :sti_subscription
  belongs_to :subscribable, polymorphic: true
  belongs_to :user


  def _type=(sType)
     sti_subscrition = sType.to_s.classify.constantize.base_class.to_s + "Subscription"
     super(sType.to_s.classify.constantize.base_class.to_s)
  end
end

class MagazineSubscription < Subscription
  # new behaviour here
end

或者我必须遵循与处理两个多态关系的 Subscription 类类似的东西以及可订阅的和他的后代所以我的问题是,当我使用多态关联时,是一种简单的方法来使用它来设置 STI 或 MTI,或者我需要做一个新的方法

标签: rubypolymorphic-associationssingle-table-inheritancemultiple-table-inheritance

解决方案


推荐阅读