0

多くの異なるタイプのサブスクリプションを保持できるモデルが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つのモデルがすべての異なるタイプのサブスクリプションを保持できる場合、特に属性を比較して特定のユーザー向けの記事などの特定のことを行う場合はどうでしょうか。

4

2 に答える 2

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
于 2012-04-04T15:37:41.763 に答える
1

これは、ポリモーフィックな関係を使用するのに適した場所です。

comment_id、thread_id、article_idを2つの列(subscribable_id、subscribable_type)に置き換え、サブスクリプションでのサブスクライブ可能な関係をポリモーフィックとして定義する必要があります。

ガイドのセクション2.9を参照してください:http://guides.rubyonrails.org/association_basics.html

于 2012-04-04T15:34:43.850 に答える