2012-04-04 9 views
0

さまざまなタイプのサブスクリプションを保持できるモデルは1つだけにしてもよろしいですか?1つのモデルに異なるタイプのサブスクリプションを保持させることはできますか?

たとえば、アプリケーション内のコメント、ユーザー、フォーラムスレッド、ニュース記事を購読できます。彼らはすべて異なる種類の列を持っています。これはアソシエーションの設定でどのように見えますか。

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 

基本的に1つのサブスクリプションモデルでは、ユーザーはコメント、スレッド、記事、さらには3つすべてを一度に購読することを選択できます。このように働くことができますか?特定のユーザーのための記事のような特定のことを行うために属性を比較する場合は、1つのモデルがすべての異なるタイプのサブスクリプションを保持できる場所

答えて

2

あなたはポリモーフィック団体でこれより普遍的なを行うことを試みることができる。そして、例えば http://guides.rubyonrails.org/association_basics.html#polymorphic-associations

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 

など新しいサブスクリプションを作成しますこの

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

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

恐ろしい(あなたが実際にタイプを心配している場合)、このようにそれを使用するには答えてくれてありがとう! – LearningRoR

1

これは、多型関係を使用するのに適しています。

comment_id、thread_id、article_idを2つの列(subscribable_id、subscribeable_type)に置き換えると、サブスクリプション可能なサブスクリプションのリレーションシップを多態性として定義する必要があります。

参照ガイドのセクション2.9:http://guides.rubyonrails.org/association_basics.html

関連する問題