2012-04-04 14 views
0

Ist es in Ordnung, nur ein Modell zu haben, das viele verschiedene Abonnements enthalten kann?Können Sie ein Modell für verschiedene Abonnements verwenden?

Zum Beispiel können Sie Kommentare, Benutzer, Foren-Themen und Nachrichtenartikel innerhalb einer Anwendung abonnieren. Sie alle haben jedoch unterschiedliche Arten von Spalten. So wie es mit den Assoziationseinstellungen aussehen würde.

Users 
attr_accessible :name, :role 
has_many :subscriptions 
has_many :comments, :threads, :articles, :through => :subscriptions 

Comments 
:content, :rating, :number 
has_many :subscriptions 
has_many :subscribers, :through => :subscriptions, :class_name => 'User' 

Threads 
:title, :type, :main_category 
has_many :subscriptions 
has_many :subscribers, :through => :subscriptions, :class_name => 'User' 

Articles 
:news_title, :importance 
has_many :subscriptions 
has_many :subscribers, :through => :subscriptions, :class_name => 'User' 


Subscription 
:content, :rating, :number, :name, :role, :title, :type, :main_category, 
:news_title, :importance, :user_id, :comment_id, :thread_id, :article_id 

belongs_to :user, :comment, :thread, :article 

Grundsätzlich mit einem Abo-Modell kann ein Benutzer wählen, um einen Kommentar, Faden oder Artikel und sogar alle drei auf einmal abonnieren. Kann es so funktionieren? Wo kann ein Modell alle Arten von Abonnements enthalten, insbesondere wenn Sie Attribute vergleichen möchten, um bestimmte Dinge wie Artikel für bestimmte Benutzer zu tun?

Antwort

2

Sie könnten versuchen, diese universellere mit polymorphen Assoziationen zu tun: http://guides.rubyonrails.org/association_basics.html#polymorphic-associations

Zum Beispiel

Subscription 
    :subscriber_id, :subscribable_id, :subscribable_type 

    belongs_to :subscriber, :class_name => "User" 
    belongs_to :subscribable, :polymorphic => true 

User 
    has_many :subscriptions 

Comment 
    has_many :subscriptions, :as => :subscribable 

Article 
    has_many :subscriptions, :as => :subscribable 

und dann Abonnement erstellen, wie dies

user.subscriptions.create(:subscribable => article) 

und es so verwenden (wenn Sie über Art eigentlich egal)

user.subscriptions.where(:subscribable_type => "Article").each do |subscription| 
    article = subscription.subscribable 
    # do stuff with article 
end 
+0

Super, danke für die Antwort! – LearningRoR

1

Dies wäre ein guter Ort, um polymorphe Beziehungen zu verwenden.

Sie würden comment_id, thread_id, article_id durch zwei Spalten (subscribe_id, subscribe_type) ersetzen, und Sie müssten die Beziehung für abonnierbar im Abonnement als polymorph definieren.

Siehe Abschnitt 2.9 des Leitfadens: http://guides.rubyonrails.org/association_basics.html

Verwandte Themen