首页 > 解决方案 > Rails 协会变得难以理解

问题描述

我有点老,但对 Rails 还是很陌生,在我的学习过程中,我陷入了无法弄清楚如何在两个实体之间建立关联的地步。

所以这里是应用程序的背景。有一个用户和广告实体。用户可以创建许多广告,而一个广告属于一个用户,因此它是一对多的非常简单的关联。现在令人困惑的是,我想添加一个功能,用户可以将广告添加到他的收藏夹中。所以一个用户可以有多个fav_ads,一个广告有多个likers。它也是直接的多对多关联,但是用户模型中已经有很多广告,所以如果我什至用户通过 fav_ads 有很多广告,其中 fav_ads 是一个桥接表,反之亦然,那么 user.ads 会给我什么?我现在必须有一种方法来解决这种情况,因为它在 webapps 和数据库中很常见,但不知道如何在 rails 中做到这一点。

标签: ruby-on-railsassociationshas-manymodel-associations

解决方案


您需要一个连接表,其中一列用于 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

然后你会有

  1. user.ads这为您提供了创建的广告
  2. user.liked_ads为您提供喜欢的广告
  3. ad.person这给了你创造者
  4. ad.likers它为您提供了所有喜欢该广告的用户。

推荐阅读