У меня есть проблема или дилемма после реализации полиморфной c ассоциации, следующей за this : Весь код расположен здесь ,
Я реализовал эту модель:
![model](https://i.stack.imgur.com/fYrEt.png)
Предположим, мне также нужна подписка на журналы. Это также будет что-то похожее на два других
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 с классами подписки. т.е. подписка Magazine имеет другое поведение и, возможно, другие атрибуты. Для этого есть простой способ выполнить sh это новое требование, например, создать класс Subscription, который обрабатывает все, что ассоциируется с polymorphi c, и другие модели:
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
или я должен следовать чему-то похожему в this с классом Subscription, обрабатывающим два отношения polymorphi c, с подписываемым и его потомками. Поэтому мой вопрос, когда я использую ассоциацию polymorphi c, это простой способ использовать это для установки STI или МТИ, или мне нужно сделать новый подход