Rails 6 唯一性验证不起作用



当我使用scope属性时,我在使用 Rails 6 中的唯一性验证器时遇到了问题。

我在ProductMachine之间有多对多关系。我的连接表称为ProductMachine

在我的连接表中,我有以下验证:

validates :product_id, uniqueness: { scope: :machine }

我正在构建一个导入工具,该工具允许我通过 csv 导入创建产品和机器的关联。在此导入中,我有创建如下新记录的代码:

machine = Machine.first
machine.product_machines.new(product_id: 1234)
machine.product_machines.new(product_id: 1234)
machine.product_machines.new(product_id: 5678)
machine.save!

当我调用machine.save!时,新product_machines将插入到数据库中,并且验证不会失败。如果我再次运行相同的代码,它会按预期失败。我认为这是因为scope在验证中创建了一个 where 子句,这会导致新记录丢失,因为 没有持久化。如何解决这个问题?下面是作用域内验证的文档。

https://guides.rubyonrails.org/active_record_validations.html#uniqueness

您正在验证对于任何给定的计算机,它只能链接到同一产品一次。您没有验证只能将一台计算机链接到一个产品。

通常,这些类型的联接表也具有UNIQUE约束,以确保没有重复的链接。

如果您尝试强制实施一个链接并且仅强制实施一个链接,使该表有效地一对一,则需要以不同的方式进行约束。