首页 > 解决方案 > 如何防止对象在与连接的多对多关系中被冗余创建

问题描述

我正在使用 Rails 为论坛/聊天室构建 API。我有三个模型:

class User < Application record
  has_many messages
  has_many :forums, through: :messages

class Message < ApplicationRecord
  belongs_to :user
  belongs_to :forum
end

class Forum < ApplicationRecord
  has_many :messages
  has_many :users, through: :messages
end

这个想法是登录的用户可以是多个不同论坛的一部分,并在该特定论坛中创建一条消息。

当用户创建一条新消息时,它也每次都创建一个新论坛。因此,相同的 user1 在“GENERAL”论坛中多次发帖导致:

User1.forums=["GENERAL","GENERAL","GENERAL"]

这打破了我的前端。

有没有办法建立关联,如果用户已经拥有此论坛,则不要将相同的论坛添加到其论坛列表中?

标签: ruby-on-railsruby

解决方案


您可以在关联上定义distinct范围:

has_many :forums, -> { distinct }, through: :messages

https://guides.rubyonrails.org/association_basics.html#scopes-for-has-many-distinct

编辑:如果您的代码实际上是在创建多个论坛,那将无济于事,因为论坛不会相同,如果这是您的情况,请显示您的表单和控制器,如果您在每个创建的消息上创建论坛,您还有另一个问题


推荐阅读