Смешайте ассоциации Polymorphi c с STI или MTI в Ruby на Rails - PullRequest
1 голос
/ 04 февраля 2020

У меня есть проблема или дилемма после реализации полиморфной c ассоциации, следующей за this : Весь код расположен здесь ,

Я реализовал эту модель:

model

Предположим, мне также нужна подписка на журналы. Это также будет что-то похожее на два других

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 или МТИ, или мне нужно сделать новый подход

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...