使用范围验证 rec ord 的唯一性,在保存嵌套记录时无法正常工作



我有一个模型User,通过UserBookBook具有多对多关系。若要创建新关系,用户可以:

  1. 从可用图书列表中选择
  2. 通过输入ISBN代码(可用于查找图书)创建新的图书请求,他们可以同时提交多个请求

我想防止某人在UserBook模型中创建重复项,所以我做了:

class UserLocation < ApplicationRecord
belongs_to :user
belongs_to :book
validates_uniqueness_of :book_id, scope: :user_id
end

当用户尝试输入已存在的书籍book_id但返回错误时,这工作正常。(我可以忍受这个)

当有人输入与新书相同的book_id两次时,就会出现真正的问题。这将创建两个用户位置记录,没有任何错误。

我从服务器日志中看到,所有检查唯一性的请求都是在保存记录之前完成的。有没有办法通过模型验证做到这一点?

我想防止在控制器中解决此问题,因此不要寻找任何建议删除数组的答案。

这是关于竞争条件的。

检查本文档中的并发部分

您可以避免添加唯一索引,例如

add_index :user_locations, :book_id, [ :user_id, :book_id ], unique: true

最新更新