2012-02-20 37 views
2

所以,我在嵌入式文檔中遇到了一些用戶認證問題。我有兩個文件,一個嵌入到另一個文件中。一個企業有很多成員。模型看起來像這樣:Rails 3和Mongoid:嵌入式文檔驗證

class Member 
    include Mongoid::Document 

    field :username,  type: String 
    field :password,   type: String 
    embedded_in :business 

    validates :username, :presence => true, :uniqueness => true, :length => 5..60 
end 

class Business 
    include Mongoid::Document 

    field :name,   type: String 
    embeds_many :members 
end 

問題是它沒有驗證用戶名在每個模型中的唯一性。當我在一個企業中保存一個成員時,我可以保存一千個相同的名字。這當然不適合一個好的認證系統。我使用Mongoid 2,Rails 3中,和Ruby 1.9

回答

7

這是使用嵌入文檔時所解釋這裏正常的行爲:MongoID validation

validates_uniqueness_of

驗證該字段是在數據庫中是唯一:請注意,對於 嵌入式文檔,這將僅檢查該字段在父文檔的上下文中是否是唯一的 ,而不是整個數據庫。

我想你想嘗試在用戶名字段中創建一個索引,以確保該集合中所有對象的唯一性。事情是這樣的:

ensureIndex({username:1},{unique:true}); 

編輯:如果你想,如果用相同的索引值的文檔存在蒙戈拋出異常,你必須避免蒙戈做了「射後不理」的格局。這意味着當您對文檔執行更新/寫入操作時,數據庫不會等待響應。

而你想通過這個參數:safe:true。通過這樣做,如果由於任何原因無法插入文檔,Mongo應該引發異常。

+0

謝謝,我一定是錯過了。所以我把這個索引放在了它的上面。唯一的問題是,當我保存具有兩個相同用戶名的東西時,它表示爲真(因爲它通過了驗證),它只是不保存。有沒有人得到保存函數返回false? – Red 2012-02-20 16:29:18

+0

這是一個很好的觀點。我一直在做一些研究,我相信你可以通過安全:真實的,這將有所幫助。看看我的編輯在答案:) – Nobita 2012-02-20 18:21:53