2013-05-16 107 views
2

我有:如何驗證範圍的唯一性?

class Foo 
    include Mongoid::Document 

    field :year, :type => Integer, :default => Time.now.utc.year 
    field :month, :type => Integer, :default => Time.now.utc.month 
    field :day, :type => Integer, :default => Time.now.utc.day 

    validates :day, :uniqueness => { :scope => [:month,:year] } 
end 

我做了以下兩次:

Foo.create(:day => 24, :year => 2013, :month => 5) 

我沒有得到任何驗證錯誤。相反,我有兩個相同的記錄。我究竟做錯了什麼?

+1

如何快速是兩個會創建執行,如果他們被解僱立刻這裏有個繼承的競爭條件。也許最初的寫入在第二次創建驗證之前被緩存。我的建議是直接在mongodb中設置一個多鍵唯一約束。 'db.foos.ensureIndex({「day」:1,「year」:1,「month」:1},{unique:true})' –

+0

不立即。我可以等待30秒甚至幾分鐘,我仍然會得到重複記錄。任何地方都沒有競賽狀作爲最後的手段,我可​​以直接在Mongodb中考慮獨特的約束。不過,我希望通過Mongoid(應用層)來做到這一點。 –

+0

在生產中,如果碰到多個併發插入,可能會遇到上述競爭條件。至於手頭的問題,我沒有在語法上或邏輯上看到任何錯誤。可能的問題:'當使用#valid時,Mongoid的行爲與Active Record略有不同?在已經存在的數據上。活動記錄的#有效?將運行所有驗證,而Mongoid的#有效?將只對內存中的文檔進行驗證作爲優化。「http://mongoid.org/en/mongoid/docs/validation.html –

回答

0

嘗試

validates_uniqueness_of :day, scope: [:month,:year]