我有一个模型User
和Book
到UserBook
有多对多的关系。要创建新关系,用户可以:
我想防止某人在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中修复此问题,因此不要寻找任何建议对阵列进行重复数据删除的答案。
答案 0 :(得分:3)
这是关于比赛条件的。
检查this docs中的并发部分
您可以避免添加唯一的索引,例如
add_index :user_locations, :book_id, [ :user_id, :book_id ], unique: true