当我使用scope
属性时,我在使用 Rails 6 中的唯一性验证器时遇到了问题。
我在Product
和Machine
之间有多对多关系。我的连接表称为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
约束,以确保没有重复的链接。
如果您尝试强制实施一个链接并且仅强制实施一个链接,使该表有效地一对一,则需要以不同的方式进行约束。