2012-06-13 112 views
0

我有一個list_users模型,其中包含用戶w列表的字段(id,list_id,user_id)。Rails + PostgreSQL,根據rails驗證規則創建重複記錄

在我的導軌模型列表中我有以下驗證,以防止重複。

validates_uniqueness_of :user_id, :scope => :list_id 

然而飄飛重複記錄在其中,最終打破了很多東西DB的list_users表上創建...

=> [#<ListMember id: 37199, user_id: 1203713, list_id: 13651, created_at: "2012-06-04 20:02:11", updated_at: "2012-06-04 20:02:11"> 

=> [#<ListMember id: 37195, user_id: 1203713, list_id: 13651, created_at: "2012-06-04 20:01:40", updated_at: "2012-06-04 20:01:40"> 

有沒有人見過這個?謝謝

回答

2

我以前見過這個。我不知道上下文對你來說是否一樣,但是我看到這個的原因基本上是我無意中在內存中創建了兩個具有相同ID對的記錄,在它們兩個上運行驗證,然後保存這兩個數據庫。唯一性驗證沒有捕捉到這一點,因爲在驗證運行的時候,數據庫中都沒有記錄。也許這是你正在經歷的。

編輯:看看你的記錄是如何靠近在一起創建的,我會說這可能是這種情況。

此外,你應該索引遷移到DB與add_index :list_users, [:user_id, :list_id]

+0

所以,基本上,這聽起來像鋼軌方法只是無能爲力地實施。如果只是在插入之前檢查,那麼總是會有可能的競爭條件。使用數據庫來處理這類事情 - 參見Dondi的答案。 –

+0

如果Richard認爲Rails實現有問題並且在這種情況下允許爭用條件,那麼您可以覆蓋類中的「save」方法,啓動事務,以獨佔模式鎖定表list_users,然後再次驗證它。 (除了添加一個唯一的索引。) –

+0

你不需要索引上的':unique => true',它是唯一的嗎? – srt32

2

我無法與Rails的部分幫助,但你應該在數據庫級別添加唯一索引:

ALTER TABLE list_users ADD UNIQUE (list_id, user_id) 

也許它將幫助您診斷Rails代碼中的錯誤。