我使用的是Rails 3.2,我正在使用Postgresql。我有一个按钮,用记录更新QuestionRecords表。该表存储user_id和question_id以及其他一些信息。在模型上,我有以下验证:
validates_uniqueness_of :user_id, :scope => :question_id
奇怪的是,尽管有这样的验证,它已经两次启用了完全相同的记录。这破坏了我正在使用的算法,所以有点像灾难。
首先,为什么会发生这种情况;其次,我怎样才能阻止它超出验证范围?
答案 0 :(得分:1)
为什么会这样?
比赛条件。应用程序端验证是一个两步过程。首先进行查询以检查现有记录。如果没有找到,应用程序继续保存。可能会发生两个(或更多)应用程序线程执行检查,两者都获得肯定结果并继续插入数据。
如何在验证之外阻止它?
您应该在数据库级别强制执行唯一性。这就像在(question_id, user_id)
上创建唯一索引一样简单。