ruby - 在 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,或者我需要做一个新的方法
解决方案
推荐阅读
- windows - 如何在使用带有文件监视的堆栈构建之前清除控制台
- postgresql - Postgres 不使用索引,即使它被创建
- nodatime - 为什么 NodaTime 中没有 ZonedDate?
- c# - 是否可以使用 InputSimulator API 将击键发送到后台窗口?
- highcharts - highstocks 响应式样式不适用于不同的设备
- javascript - 在 Meteor 网络应用程序中单击时,HTML5 音频播放列表会打开新选项卡
- sql - DB2 SQL - 将十进制 CC + YYMMDD 转换为日期
- ruby - Sinatra 灵活的文件包含/更新,无需重启
- javascript - JavaScript - 函数运行时声明的变量未定义错误
- mysql - mysql 使用 group by 计数以显示每个国家/地区的所有类型,包括没有记录的情况为 0