【发布时间】:2010-03-29 19:45:20
【问题描述】:
我正在尝试做的是这样的:
例如,我有数据类型“用户”和“文章”。我想在这两者之间建立关系,但方式不止一种。
例如,我想让用户“喜欢”或“收藏”一篇文章。所以我需要在数据库中有两种关系,一种用于用户喜欢文章,另一种用于用户收藏,因此例如制作“user_article”表是不够的,对吗?
最好的方法是什么?
【问题讨论】:
标签: ruby-on-rails database database-relations
我正在尝试做的是这样的:
例如,我有数据类型“用户”和“文章”。我想在这两者之间建立关系,但方式不止一种。
例如,我想让用户“喜欢”或“收藏”一篇文章。所以我需要在数据库中有两种关系,一种用于用户喜欢文章,另一种用于用户收藏,因此例如制作“user_article”表是不够的,对吗?
最好的方法是什么?
【问题讨论】:
标签: ruby-on-rails database database-relations
您所描述的是“数据模型”而不是“数据类型”。数据类型 = 字符串、整数等。如果它是一个 Active Record 对象,它是一个数据模型或更具体地说是一个 Active Record 模型。
Eimantas 指出您描述的是两个“has_many”关系,而不是他帖子中所写的“have_many”。在他的示例中,书签称为连接模型。请记住,您可以将其他东西放在连接模型中,并使用那里的关系来完成任务。假设您想要一个书签订单或一个最喜欢的排名 - 连接模型就是这样做的理想点。
精简示例:
class Article < ActiveRecord::Base
has_many :users, :through => :user_bookmarks
end
class UserBookmark < ActiveRecord::Base
belongs_to :user
belongs_to :article
end
class User < ActiveRecord::Base
has_many :user_bookmarks
has_many :articles, :through => :user_bookmarks
end
了解基础知识后需要注意的事项: 计数器缓存 - 如果您正在计数,它们就是您的朋友。
使用这 2 个连接模型可能更容易和更简洁,而不是现在尝试深入研究多态性。在你启动并运行它之后,你可以继续探索它。
【讨论】:
我建议有bookmarking_type 的Bookmarking 模型(注意type 是为RoR 保留的)。然后你可以has_many :bookmarkings 和has_many :liked_articles, :through => :bookmarkings 和has_many :bookmarks, :through => :bookmarkings。当然,您应该添加条件或只是将 SQL 加入这些关联,但一切都应该是好的。我确实相信甚至有插件,只是想不起名字atm。
【讨论】: