Rails 协会变得难以理解
Posted
技术标签:
【中文标题】Rails 协会变得难以理解【英文标题】:Rails association getting complex to understand 【发布时间】:2021-12-05 01:39:45 【问题描述】:我有点老,但对 Rails 还是很陌生,在我的学习过程中,我陷入了一个无法弄清楚如何在两个实体之间建立关联的地步。
所以这里是应用程序的背景。 有一个用户和广告实体。 用户可以创建许多广告,并且一个广告属于一个用户,因此它是一对多的非常简单的关联。 现在令人困惑的是,我想添加一个功能,用户可以将广告添加到他的收藏夹中。 所以一个用户可以有多个fav_ads,一个广告有多个likers。 它也是直接的多对多关联,但是用户模型中已经有很多广告,所以如果我什至用户通过 fav_ads 有很多广告,其中 fav_ads 是一个桥接表,反之亦然,那么 user.ads 会给我什么?我现在必须有一种方法来解决这种情况,因为它在 webapps 和数据库中很常见,但不知道如何在 rails 中做到这一点。
【问题讨论】:
如果您只能收藏您已经喜欢的广告,您可以在该表格中添加一列boolean :favourited
【参考方案1】:
您需要一个连接表,其中一列用于 user_id,一列用于 ad_id。 此表可能称为“user_ad_like”。
对于迁移,您使用 create_join_table
(docs)
类似
class UserAdLike < ActiveRecord::Migration[6.0]
def change
create_join_table(:users, :ads, table_name: "user_ad_like"
end
end
对于您将使用的模型 has_and_belongs_to_many (docs)
class Ad
# Likes (ad.likers)
has_and_belongs_to_many :likers, class_name: 'User', join_table: "user_ad_like"
# Creator (ad.user)
belongs_to :user
end
class User
# Liked ads (user.liked_ads)
has_and_belongs_to_many :liked_ads, class_name: 'Ad', join_table: "user_ad_like"
# Ads create (user.ads)
has_many :ads
end
你会得到
user.ads
为您提供制作的广告
user.liked_ads
为您提供喜欢的广告
ad.person
给你创造者
ad.likers
为您提供所有喜欢该广告的用户。
【讨论】:
以上是关于Rails 协会变得难以理解的主要内容,如果未能解决你的问题,请参考以下文章
Ruby on rails 协会 - 用户(设计)在注册和登录后可以“创建团队”或“加入团队”