你能让一个模型持有不同类型的订阅吗?

时间:2012-04-04 15:08:37

标签: ruby-on-rails ruby-on-rails-3

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

例如,假设您可以订阅应用程序内的评论,用户,论坛帖子和新闻文章。它们都有不同类型的列。这与协会设置有关。

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

基本上,对于一种订阅模式,用户可以选择订阅评论,帖子或文章,甚至一次订阅所有三种。它可以这样工作吗?哪个模型可以容纳所有不同类型的订阅,特别是当您想比较属性以执行特定用户的文章等某些事情时?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

这是使用多态关系的好地方。

您可以将comment_id,thread_id,article_id替换为两列(subscribable_id,subscribable_type),并且您需要将订阅时订阅的关系定义为多态。

参见指南第2.9节:http://guides.rubyonrails.org/association_basics.html