ruby-on-rails - 如果具有相同属性的旧对象关联到同一个当前对象的关联表,则不创建对象
问题描述
我有 has_many: : 通过与 Foo、FooBar 和 Bar 表的关联。这是他们的实现:
Class Foo < ApplicationRecord
has_many :foo_bars, dependent: :destroy
has_many :bars, through: :foo_bars
end
Class FooBar < ApplicationRecord
belongs_to :foo
belongs_to :bar
end
Class Bar < ApplicationRecord
has_many :foo_bars, dependent: :destroy
has_many :foos, through: :foo_bars
end
例子:
bar = Bar.create(name: "bar")
bar.foos << Foo.create(name: "foo")
foo.bars has bar object with name "bar"
bar.foos has foo object with name "foo"
和
FooBar.first object has foo_id: 1, bar_id: 1
让我们创建一个新的 Bar 对象
bar2 = Bar.create(name: "bar2")
现在我们有两个 bar 对象
我想要做的是,如果 foo.name = "foo" 并且它与名为 "bar" 的 bar 关联,我不想创建一个新的 foo 对象,因为 bar 已经具有 "foo" 的 foo。但是我想创建 foo 对象,如果 foo.name = "foo" 并且它与 bar2 对象相关联,因为 bar2.foos 没有名为 "foo" 的 foo
解决方案
我不确定你到底想要什么关联,因为所有这些 foobar 都很难解析。但听起来您想根据范围验证唯一性,这可以通过将以下行添加到您想要唯一的模型来完成
validates_uniqueness_of :name, scope: :parent_id
要使用 :scope 选项创建数据库约束以防止可能违反唯一性验证,您必须在数据库中的两个列上创建唯一索引。根据您使用的数据库,您需要查看MySQL 手册以获取有关多列索引的更多详细信息,或者查看PostgreSQL 手册以获取引用一组列的唯一约束示例(也来自 rails guide on validate唯一性)。
推荐阅读
- ios - 通过 UIButton Toggle 更改地图类型 - Google Maps iOS SDK
- javascript - 具有不同点形状的两层
- git - 如果我们从本地推送到远程提交,它是分支提交 X 和功能提交 Y 的合并,但远程提交 Y 不存在,它会工作吗?
- java - 如何对两个数组进行排序但保持相应的顺序?
- javascript - Vue.js - 无法触发 DOM 更新
- pandas - 如何在 Pandas 的 DataFrame 中创建一个新的条件计数列
- reactjs - React Auth0 关键依赖:require 函数的使用方式是无法静态提取依赖
- python - 关于强度的 Python 图形库
- javascript - 如何在反应中使用带有 async/await 语法的 Axios?
- javascript - Array.fill 和 [...] 之间的行为差异