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 协会变得难以理解的主要内容,如果未能解决你的问题,请参考以下文章

在 Rails 中组织以下协会的最佳方式是啥?

Rails 协会 - 特定案例

Ruby on rails 协会 - 用户(设计)在注册和登录后可以“创建团队”或“加入团队”

ruby Rails has_many:通过多态协会(http://goo.gl/lxmehk)

红宝石儿童的孩子协会

自加入HABTM协会的范围