多态关联解决了什么?

时间:2012-05-29 23:56:45

标签: ruby-on-rails polymorphic-associations

假设我有一个带有“收藏夹”功能的应用程序,用户可以在其收藏夹列表中添加文档,备注或评论。

在我的脑海里......

  • 用户has_many收藏夹
  • 收藏belongs_to用户

  • 文档belongs_to收藏
  • 注意belongs_to收藏
  • 评论belongs_to收藏

这种类型的关联有什么问题?多态关联会有什么帮助?

1 个答案:

答案 0 :(得分:1)

因为那么你最喜欢的实例将不知道它最喜欢什么:) 它知道它has_one :note,还有__ :comment,还是?但不是两个肯定。

多态关联相反的方式有帮助,因为它会表示一个Favorite对象belongs_to :favorited对象是多态的,它可以是任何类,其名称将是存储在:favorited_type字符串数据库列中,因此您最喜欢的对象将知道它有利于注释或文档或注释。

带一些代码

class Note
  has_many :favorites, :as => :favorited
  has_many :fans, :through => :favorites, :source => :user
end

class Discussion
  has_many :favorites, :as => :favorited
  has_many :fans, :through => :favorites, :source => :user
end

class Comment
  has_many :favorites, :as => :favorited
  has_many :fans, :through => :favorites, :source => :user
end

class Favorite
  belongs_to :user
  belongs_to :favorited, :polymorphic => true # note direction of polymorphy
end

class User
  has_many :favorites
  has_many :favorite_notes, :through =>  :favorites, :source => favorited, :source_type => "Note"
  has_many :favorite_comments, :through =>  :favorites, :source => favorited, :source_type => "Comment"
  has_many :favorite_discussions, :through =>  :favorites, :source => favorited, :source_type => "Discussion"

end

(只是正确设置你的数据库)这个设计是这种用户收藏的标准。