ruby-on-rails - Rails 协会变得难以理解
问题描述
我有点老,但对 Rails 还是很陌生,在我的学习过程中,我陷入了无法弄清楚如何在两个实体之间建立关联的地步。
所以这里是应用程序的背景。有一个用户和广告实体。用户可以创建许多广告,而一个广告属于一个用户,因此它是一对多的非常简单的关联。现在令人困惑的是,我想添加一个功能,用户可以将广告添加到他的收藏夹中。所以一个用户可以有多个fav_ads,一个广告有多个likers。它也是直接的多对多关联,但是用户模型中已经有很多广告,所以如果我什至用户通过 fav_ads 有很多广告,其中 fav_ads 是一个桥接表,反之亦然,那么 user.ads 会给我什么?我现在必须有一种方法来解决这种情况,因为它在 webapps 和数据库中很常见,但不知道如何在 rails 中做到这一点。
解决方案
您需要一个连接表,其中一列用于 user_id,一列用于 ad_id。该表可能称为“user_ad_like”。
对于您使用的迁移create_join_table
(文档)
就像是
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
它为您提供了所有喜欢该广告的用户。
推荐阅读
- javascript - Puppeteer page.waitForNavigation() 超时错误处理
- react-native - 领域错误 - _constructor 必须是“函数”类型,得到(未定义)
- android - Android AndroidManifest.xml 错误:在包 'android' 中找不到属性 'appComponentFactory' 的资源标识符
- grails - grails cobertura findAllBy
- mysql - INSERT INTO SELECT - 超过 1 行
- sql - SQL Select 语句 - 使用等于两个变量的一列进行选择
- laravel-5 - Laravel 背包:用于多态关系的 CRUD
- google-analytics - '平均。Google Analytics 上的“页面停留时间”为零
- python - Tensorflow 估计器:不同的纪元数给出相同的结果
- xml - 如何按xslt中的属性值对xml文件进行排序?