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

时间:2019-04-01 13:06:03

标签: ruby-on-rails

我有一个模型UserBookUserBook有多对多的关系。要创建新关系,用户可以:

  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作为新书两次的情况下。这将创建两个UserLocation记录,而不会出现任何错误。

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

我想防止在Controller中修复此问题,因此不要寻找任何建议对阵列进行重复数据删除的答案。

1 个答案:

答案 0 :(得分:3)

这是关于比赛条件的。

检查this docs中的并发部分

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

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