【问题标题】:Rails association getting complex to understandRails 协会变得难以理解
【发布时间】:2021-12-05 01:39:45
【问题描述】:

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

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

【问题讨论】:

  • 如果您只能收藏您已经喜欢的广告,您可以在该表格中添加一列boolean :favourited

标签: ruby-on-rails associations has-many model-associations


【解决方案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

你会得到

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

【讨论】:

    猜你喜欢
    • 2020-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 2014-11-15
    • 2014-05-16
    • 1970-01-01
    相关资源
    最近更新 更多