假设我有一个具有“收藏夹”功能的应用程序,用户可以在其中将文档、注释或评论添加到他的收藏夹列表中。
在我脑海里..
- 用户
has_many
收藏 - 收藏
belongs_to
用户
- 记录
belongs_to
收藏夹 - 记
belongs_to
下收藏夹 - 评论
belongs_to
收藏
这种关联有什么问题,多态关联有什么帮助?
假设我有一个具有“收藏夹”功能的应用程序,用户可以在其中将文档、注释或评论添加到他的收藏夹列表中。
在我脑海里..
has_many
收藏belongs_to
用户belongs_to
收藏夹belongs_to
下收藏夹belongs_to
收藏这种关联有什么问题,多态关联有什么帮助?
因为那样你的 Favorite 实例将不知道它喜欢什么 :) 它知道它has_one :note
,但也有 has_one :comment
,或者?但肯定不是两者兼而有之。
多态关联相反的方式会有所帮助,因为它将表示一个Favorite
对象属于:favorited
多态的对象,因为它可以是任何类,其名称将存储在:favorited_type
字符串 db 列中,因此您最喜欢的对象会知道它偏爱注释或文档或评论。
有一些代码
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
(只需正确设置您的数据库)此设计是此类收藏用例的标准。