2014-10-03 69 views
1

我使用的是Rails 3.2,我使用Postgresql。我有一個按鈕用記錄更新QuestionRecords表。該表存儲user_id和question_id以及其他幾位信息。在模型上我有以下驗證:爲什麼rails 3.2允許重複記錄,儘管驗證?

validates_uniqueness_of :user_id, :scope => :question_id 

奇怪的是,它有兩次啓用完全相同的記錄插入數據庫,儘管這種驗證。這破壞了我正在使用的一種算法,所以有點災難。

首先,爲什麼會發生這種情況;其次,我怎樣才能防止它超出驗證?

回答

1

這是怎麼發生的?

比賽條件。應用程序端驗證是一個兩步過程。首先進行查詢以檢查現有記錄。如果找不到,應用程序繼續保存。它可能發生兩個(或更多)應用程序線程執行檢查,都會得到肯定的結果,並且都會繼續插入數據。

如何防止超出驗證範圍?

您應該在數據庫級別強制執行唯一性。這與在(question_id, user_id)上創建唯一索引一樣簡單。