0

只有一种模型可以容纳多种不同类型的订阅是否可以?

例如,假设您可以订阅应用程序内的评论、用户、论坛主题和新闻文章。不过,它们都有不同类型的列。这是关联设置的外观。

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

基本上,使用一种订阅模式,用户可以选择订阅评论、主题或文章,甚至同时订阅所有三者。它可以这样工作吗?一个模型可以容纳所有不同类型的订阅,尤其是当您想要比较属性以执行某些事情(例如为某些用户提供文章)时?

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 替换为两列(subscribable_id、subscribable_type),并且您需要将订阅时可订阅的关系定义为多态。

请参阅指南的第 2.9 节:http: //guides.rubyonrails.org/association_basics.html

于 2012-04-04T15:34:43.850 回答