簡體   English   中英

如果具有相同屬性的舊 object 關聯到同一個當前對象的關聯表,則不要創建 object

[英]Do not create object if old object with same attribute is associated to same current object's associated table

我有 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 object

bar2 = Bar.create(name: "bar2")

現在我們有兩個 bar 對象

我想要做的是,我不想創建一個新的 foo object 如果 foo.name = "foo" 並且它與名為 "bar" 的 bar 相關聯,因為 bar 已經具有 "foo" 的 foo。 但是我想創建 foo object 如果 foo.name = "foo" 並且它與 bar2 object 相關聯,因為 bar2.foos 沒有名為“foo”的 foo

我不確定你到底想要什么關聯,因為所有這些 foobar 都很難解析。 但聽起來您想基於 scope 驗證唯一性,這可以通過將以下行添加到您想要唯一的 model 來完成

validates_uniqueness_of :name, scope: :parent_id

要使用:scope 選項創建數據庫約束以防止可能違反唯一性驗證,您必須在數據庫中的兩個列上創建唯一索引。 根據您使用的數據庫,您需要查看MySQL 手冊以獲取有關多列索引的更多詳細信息,或者查看 PostgreSQL 手冊以獲取引用一組列的唯一約束示例(也來自 rails guide on validate唯一性)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM