Rails 中的“关注”和“收藏”关系模型——一个主模型或每个关系的特定模型

Posted

技术标签:

【中文标题】Rails 中的“关注”和“收藏”关系模型——一个主模型或每个关系的特定模型【英文标题】:"Following" and "favorites" relationship models in Rails---one master model or specific models for each relationship 【发布时间】:2012-07-20 06:36:43 【问题描述】:

我正在开发一个应用程序,用户可以与其他用户建立两种关系之一——favoriting 他们,或者following 他们——我想相反的操作,@987654323 @ 和 is being follow by 也将作为我想要调用的方法出现。

在制作用户模型时我应该考虑哪些因素?具体来说,我应该有一个模型,即关系,它指定:

Relationships
user_1 | relationship_type | user_2

其中的 relationship_type 是 favoriting 还是 following

或者我应该有 2 个独立的模型:

Favorites
user_1 | user_2

Follows
user_1 | user_2

我对数据库了解不多,请问在这两种潜在设置之间进行选择时有哪些注意事项? 2 比 3 更标准化还是更少?这有关系吗?什么情况下?

更新

抱歉,这让我感到震惊:假设有第三种关系,例如“reviews”/“reviewed_by”——问题是关于 3 种,而不是 2 种不同的双向关系类型。增加关系类型的数量会对此产生影响吗?

Favorites
user_1 | user_2

Follows
user_1 | user_2

Reviews
user_1 | user_2

【问题讨论】:

使用更好的命名使其更易于阅读。使用诸如喜爱用户和喜爱用户的东西。使用方法#1 【参考方案1】:

我会在一个表中使用 2 个不同的模型,即使用单表继承模式。 这样,您将获得一个看起来接近您的选项 #1 的 db 表,并拥有一个干净的模型,其中包含对象模型端的收藏夹和关注两个不同的类,从而产生更清晰的代码和命名。

至于命名,Michael Hartl 在他的示例中使用了“followers”和“followed_users”,这似乎与您正在努力的内容非常相似: http://ruby.railstutorial.org/chapters/following-users#top

【讨论】:

我正要说:这也便于扩展,以防您只想添加与用户的另一个关系,然后我看到了您的更新 ;-)

以上是关于Rails 中的“关注”和“收藏”关系模型——一个主模型或每个关系的特定模型的主要内容,如果未能解决你的问题,请参考以下文章

Rails 尝试访问模型中的参数

如何将现有的一对多关系迁移到 Rails 和 ActiveRecord 中的多对多

删除存在于另一个命名空间 rails 中的模型

用抽象类在Rails中表示has_many关系

使用外键关系创建 Rails 模型和脚手架的教程 [关闭]

Rails 中具有相同键的两个表而不是 has_one 关系