只有一个模型可以容纳多种不同类型的订阅吗?
例如,假设您可以订阅应用程序内的评论,用户,论坛帖子和新闻文章。它们都有不同类型的列。这与协会设置有关。
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
基本上,对于一种订阅模式,用户可以选择订阅评论,帖子或文章,甚至一次订阅所有三种。它可以这样工作吗?哪个模型可以容纳所有不同类型的订阅,特别是当您想比较属性以执行特定用户的文章等某些事情时?
答案 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