ruby-on-rails - 如何防止对象在与连接的多对多关系中被冗余创建
问题描述
我正在使用 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"]
这打破了我的前端。
有没有办法建立关联,如果用户已经拥有此论坛,则不要将相同的论坛添加到其论坛列表中?
解决方案
您可以在关联上定义distinct
范围:
has_many :forums, -> { distinct }, through: :messages
https://guides.rubyonrails.org/association_basics.html#scopes-for-has-many-distinct
编辑:如果您的代码实际上是在创建多个论坛,那将无济于事,因为论坛不会相同,如果这是您的情况,请显示您的表单和控制器,如果您在每个创建的消息上创建论坛,您还有另一个问题
推荐阅读
- jenkins - Jenkins参数化构建 - 将数据发布到url而不是包含在查询参数中?
- java - 如何使用 qaf Web 服务请求调用管理具有多个请求的 cookie?
- python - 将 json 数组解码为frozensets
- c++ - 为什么最后一个 SPLIT 函数会导致 SEGMENTATION FAULT?如何解决这个问题
- r - ggplot不同的lm公式
- qtquick2 - 为什么 QQmlComponent::create() 返回 nullptr?
- android - Nativescript:如何为模拟器和真实设备使用不同的环境变量?
- scala - 使用 scalasca 访问 Neustar API
- json - 使用 vb 反序列化没有固定 KEY 的 JSON 字符串
- bash - 调用roslaunch后自动终止所有节点