我有一个模型User
,通过UserBook
与Book
具有多对多关系。若要创建新关系,用户可以:
- 从可用图书列表中选择
- 通过输入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